依存関係が挿入されたWPFMVVMビューモデルを作成しようとしていますが、System.Timing.TimerMoqを使用してビューモデルをテストしたいと考えています。
Timerインターフェイスを持つクラスの周りに薄いラッパーを作成しましたITimerが、クラスへのタイマーの寄与を実際にテストするための最良の方法がわかりません。模擬経過イベントを「強制」する良い方法はありますか?他の誰かがより良いテクニックを持っていますか?
依存関係が挿入されたWPFMVVMビューモデルを作成しようとしていますが、System.Timing.TimerMoqを使用してビューモデルをテストしたいと考えています。
Timerインターフェイスを持つクラスの周りに薄いラッパーを作成しました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)