我正在尝试创建一个注入了依赖项的 WPF MVVM 视图模型System.Timing.Timer
,并希望使用 Moq 测试该视图模型。
Timer
我围绕具有 interface的类编写了一个薄包装器ITimer
,但不确定真正测试计时器对类的贡献的最佳方法。有没有一种“强制”模拟已过事件的好方法?其他人有更好的技术吗?
我正在尝试创建一个注入了依赖项的 WPF MVVM 视图模型System.Timing.Timer
,并希望使用 Moq 测试该视图模型。
Timer
我围绕具有 interface的类编写了一个薄包装器ITimer
,但不确定真正测试计时器对类的贡献的最佳方法。有没有一种“强制”模拟已过事件的好方法?其他人有更好的技术吗?
您应该单独测试您的代码。否则,您不知道您的代码是否按预期运行,或者外部依赖是否存在一些副作用。因此,为外部资源(配置文件、计时器等)创建可模拟的包装器是将 SUT 与外部代码分开的唯一方法。
您可以使用类似框架Moq
来触发事件。你也可以FakeTimer
像这样创建:
public class FakeTimer : IMyTimer
{
private event ElapsedEventHandler elaspedHandler;
private bool _enabled;
public void Dispose() => throw new NotImplementedException();
public FakeTimer(ElapsedEventHandler elapsedHandlerWhenTimeFinished, bool startImmediately)
{
this.elaspedHandler = elapsedHandlerWhenTimeFinished;
_enabled = startImmediately;
}
public void Start() => _enabled = true;
public void Stop() => _enabled = false;
public void Reset() => _enabled = true;
internal void TimeElapsed()
{
if (this._enabled)
elaspedHandler.Invoke(this, new EventArgs() as ElapsedEventArgs);
}
}
您将在TimeElapsed()
单元测试中调用什么来指示时间已经过去。
然后它将调用与其关联的事件。
在下面的这个例子中,MyCallBackMethod
将被调用fakeTimer.TimeElapsed()
var fakeTimer = new FakeTimer(350, MyCallBackMethod, false)