5

コードの一部をテストする必要があります

        var watcher = new FakeIFileSystemWatcher();
        watcher.FilesToBeImported
            .ObserveOnDispatcher()
            .Subscribe(list.Add);

だから私はこの小さな単体テストを作成しましたが、原因リストに合格させることはできません.Countは常に0です

    [Test]
    public void Foo()
    {
        var list = new List<string>();

        var watcher = new FakeIFileSystemWatcher();
        watcher.FilesToBeImported
            .ObserveOnDispatcher()
            .Subscribe(list.Add);

        Task task = Task.Factory.StartNew(() =>
        {                
            watcher.AddFile("cc");
            watcher.AddFile("cc");
            watcher.AddFile("cc");
        }, TaskCreationOptions.LongRunning);
        Task.WaitAll(task);

        Assert.AreEqual(3, list.Count);
    }

メソッドをコメントアウトすると

            .ObserveOnDispatcher()

合格しますが、 ObserveOnDispatcher() でも動作させるにはどうすればよいですか?

4

3 に答える 3

7

使用する場合はObserveOnDispatcher、「ディスパッチャ」への依存関係を作成します。これは、ウィンドウとメッセージ ループが必要であることを意味します。単体テストでこの問題を回避するには、代わりにObserveOnスケジューラを使用する方法を使用し、依存性注入を使用して正しいスケジューラを注入します。単体テストでは使用できScheduler.Immediate、実際のアプリケーションでは使用できますDispatcherScheduler.InstanceTestScheduler仮想時間で単体テストを実行するのに非常に役立つも存在することに注意してください。

于 2012-07-04T15:41:48.700 に答える
1

ここで見つけたクラスDispatcherUtilを使用して解決しまし たユニットテストでのWPFディスパッチャーの使用

今私のコードは次のとおりです

    [Test]
    public void Foo()
    {
        var list = new List<string>();

        var watcher = new FakeIFileSystemWatcher();
        watcher.FilesToBeImported
            .ObserveOnDispatcher()
            .Subscribe(list.Add);

        Task task = Task.Factory.StartNew(() =>
        {
            watcher.AddFile("cc");
            watcher.AddFile("cc");
            watcher.AddFile("cc");
            watcher.AddFile("cc");
        }, TaskCreationOptions.LongRunning);
        Task.WaitAll(task);
        DispatcherUtil.DoEvents();
        Assert.AreEqual(4, list.Count);
    }

そしてそれは魅力のように機能します

于 2012-07-05T07:08:28.727 に答える