1

私は ReactiveAsyncCommand を持っていますが、それは今のところしばらく眠っているだけです:

public ReactiveAsyncCommand SignIn { get; private set; }

//from constructor:
SignIn = new ReactiveAsyncCommand(this.WhenAny(x => x.Username, x => x.Password,
                                                  (u, p) =>
                                                  !string.IsNullOrWhiteSpace(u.Value) &&
                                                  !string.IsNullOrWhiteSpace(p.Value)));

SignIn.RegisterAsyncAction(_ => Thread.Sleep(4000));

コマンドの実行中に進行状況インジケーターを表示したいので、その可視性をバインドするプロパティを作成しました。

private ObservableAsPropertyHelper<bool> _Waiting; 
public bool Waiting
{
    get { return _Waiting.Value; }
}

//from constructor:
_Waiting = SignIn.ItemsInflight
                 .Select(x => x > 0)
                 .ToProperty(this, x => x.Waiting);

したがって、実際には機能しているように見えますが、コマンドの実行中は Waiting allways が true になることを示す単体テストが大好きです。

testscheduler に関するこのブログ投稿を読みましたが、それを使用するのに苦労しています。

    [TestMethod]
    public void flag_waiting_while_signing_in()
    {

        (new TestScheduler()).With(scheduler =>
            {
                var vm = new SignInViewModel {Username = "username", Password = "password"};

                vm.SignIn.Execute(null);

                Assert.IsTrue(vm.Waiting); 
            });
    }

このテストは失敗します (待機は false)。scheduler.start()andへの呼び出しを追加しようとしましたscheduler.advanceBy( )が、違いはありませんでした。

これをテストする私のアプローチは間違っていますか? アプローチが正しい場合、他に何が間違っていますか?

編集
だから私はThread.Sleep()提案されたように変更しました:

SignIn.RegisterAsyncAction(_ =>
            {
                Observable.Interval(TimeSpan.FromMilliseconds(4000));
            });

そして、フラグscheduler.AdvanceBy(...)をチェックする前に呼び出して時間を制御しようとしWaitingました。しかし、まだ緑はありません。

4

1 に答える 1

1

TestScheduler が失敗する理由は、TestScheduler のビューの外に非同期のソースがあるためThread.Sleepです。それを制御できる方法はありません。常に実際の 4 秒かかります。それをObservable.Interval代わりに置き換えると、期待どおりに機能するはずです

[TestMethod]
public void flag_waiting_while_signing_in()
{

    (new TestScheduler()).With(scheduler =>
        {
            var vm = new SignInViewModel {Username = "username", Password = "password"};

            vm.SignIn.Execute(null);

            scheduler.AdvanceBy(TimeSpan.FromMilliseconds(2000));
            Assert.IsTrue(vm.Waiting); 

            // Move past the end
            scheduler.AdvanceBy(TimeSpan.FromMilliseconds(5000));
            Assert.IsFalse(vm.Waiting); 
        });
}
于 2013-02-24T01:41:22.843 に答える