0

公式 RX ブログに次のがあります。

var scheduler = new TestScheduler();

var xs = scheduler.CreateColdObservable(
    OnNext(10, 42),
    OnCompleted<int>(20)
);

var res = scheduler.Start(() => xs);

res.Messages.AssertEqual(
    OnNext(210, 42),            // Subscribed + 10
    OnCompleted<int>(220)       // Subscribed + 20
);

xs.Subscriptions.AssertEqual(
    Subscribe(200, 1000)        // [Subscribed, Disposed]
);

このようなことを reactui で行いたいと思います。つまり、scheduler.CreateColdObservable(...) の代わりに、実際のプロパティ変更通知からのストリームを使用します。問題は、私が vm.ObservableForProperty と vm.Changed を試してみたが、一貫して動作しなかったことです (すべてのプロパティ変更がイベントを作成したわけではないか、値が null でした)。

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

internal class ProductFileEditorVM : ReactiveObject
{
    private readonly List<string> _preloadedList;

    private bool _OnlyContainingProduct;
    public bool OnlyContainingProduct
    {
        get { return _OnlyContainingProduct; }
        set
        {
            this.RaiseAndSetIfChanged(x => x.OnlyContainingProduct, value);
        }
    }

    private ObservableAsPropertyHelper<IEnumerable<string>> _RepoList;
    public IEnumerable<string> RepoList
    {
        get{return _RepoList.Value;}
    }

    public ProductFileEditorVM(RepositoryManager repositoryManager)
    {

        //Set defaults
        OnlyContainingProduct = true;

        //Preload
        _preloadedList = repositoryManager.GetList();

        var list = this.WhenAny(x => x.OnlyContainingProduct,
                     ocp =>
                     ocp.Value
                         ? _preloadedRepoList.Where(repo => repo.ToLower().Contains("product"))
                         : _preloadedRepoList);
        list.ToProperty(this, x => x.RepoList);
    }
}

理想的には、2 つのプロパティで Observable.CombineLatest を使用し、タプルを作成して、最初の例のように assert 式でこのタプルを比較したいと思います。

良い結果は次のようになります。

  1. [OnlyContainingProduct==true;RepoList= フィルタリングされたもの]
  2. !OnlyContainingProduct を false に変更
  3. [OnlyContainingProduct==false;RepoList= リスト全体]

*それとも、これはアプローチの仕方が間違っているのでしょうか? これについて私が見た唯一の例は、ミリ秒などの実際の時間測定を使用していますが、Throttle および同様の方法の場合を除いて、それらがどのように役立つかはわかりません。*

4

1 に答える 1

4

したがって、 timeに関連するテストを行っているのではなく、順序に基づくテストのみを行っているため(つまり、「これを実行した後、これを実行した後、それを実行する必要があります)、通常のテストを作成する方が実際にははるかに簡単です。単体テスト.TestSchedulerは大きなハンマーです:)

したがって、次のようなことができます。

var fixture = new ProductFileEditorVM();

bool repoListChanged = false;
fixture.WhenAny(x => x.RepoList, x => x.Value)
    .Subscribe(_ => repoListChanged = true);

fixture.OnlyContainingProduct = true;
Assert.True(repoListChanged);

TestScheduler を使用する場合

ただし、RepoList の読み込みが非同期で、時間がかかる可能性があり、「読み込み中」の状態を表現したい場合は、TestScheduler が適しています。たとえば、+20ms、AdvanceTo(200ms) でチェックボックスをクリックします。 Loading 状態かどうかを確認し、AdvanceTo(10min)、リストが更新され、状態が Loading でないことを確認します

于 2013-01-23T21:09:28.070 に答える