私は 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
ました。しかし、まだ緑はありません。