8

我正在尝试创建一个注入了依赖项的 WPF MVVM 视图模型System.Timing.Timer,并希望使用 Moq 测试该视图模型。

Timer我围绕具有 interface的类编写了一个薄包装器ITimer,但不确定真正测试计时器对类的贡献的最佳方法。有没有一种“强制”模拟已过事件的好方法?其他人有更好的技术吗?

4

2 回答 2

3

您应该单独测试您的代码。否则,您不知道您的代码是否按预期运行,或者外部依赖是否存在一些副作用。因此,为外部资源(配置文件、计时器等)创建可模拟的包装器是将 SUT 与外部代码分开的唯一方法。

于 2012-10-22T19:06:31.453 回答
0

您可以使用类似框架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)

于 2021-09-13T16:37:58.397 回答