自从我开始以测试/行为驱动的方式开发,我就很欣赏能够模拟每个依赖项的能力。
由于像Moq这样的模拟框架在被告知模拟接口时效果最好,所以现在我几乎为我创建的每个类实现一个接口,因为很可能我迟早要将其模拟出来进行测试。 嗯,编程到接口是一个好的实践方法。
有时,我的类会依赖于 .Net 类(例如 FileSystemWatcher、DispatcherTimer)。在这种情况下,如果有一个接口,那么我就可以依赖于 IDispatcherTimer,以便能够传递一个模拟对象并模拟它的行为,看看我的系统是否正确地反应了。
不幸的是,上述两个类都没有实现这样的接口,所以我只能采取创建适配器的方法,适配器除了继承原始类并符合接口外,什么也不做。
以下是 DispatcherTimer 的适配器及其对应的接口:
using System;
using System.Windows.Threading;
public interface IDispatcherTimer
{
#region Events
event EventHandler Tick;
#endregion
#region Properties
Dispatcher Dispatcher { get; }
TimeSpan Interval { get; set; }
bool IsEnabled { get; set; }
object Tag { get; set; }
#endregion
#region Public Methods
void Start();
void Stop();
#endregion
}
/// <summary>
/// Adapts the DispatcherTimer class to implement the <see cref="IDispatcherTimer"/> interface.
/// </summary>
public class DispatcherTimerAdapter : DispatcherTimer, IDispatcherTimer
{
}
尽管这不是世界末日,但我想知道为什么 .Net 开发人员没有花费一点时间从一开始就实现这些接口。这让我感到困惑,特别是现在微软内部正在大力推行良好的实践。有人有任何(可能是内部)信息,为什么存在这种矛盾吗?