gpt4 book ai didi

wpf - ReactiveUI:从单元测试中测试可观察的属性

转载 作者:行者123 更新时间:2023-12-03 11:00:07 24 4
gpt4 key购买 nike

RX官方博客上有此example:

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);
}
}

理想情况下,我想在两个属性上使用Observable.CombineLatest,并创建一个元组,然后像第一个示例一样在assert表达式中比较此元组。

好的结果将是:
  • [OnlyContainingProduct == true; RepoList =已过滤的一个]
  • !将OnlyContainingProduct更改为假
  • [OnlyContainingProduct == false; RepoList =整个列表]

  • *或者这是错误的处理方式吗?我看到的唯一示例使用的是毫秒等实际时间量度,但除了 throttle 和类似方法外,我看不到它们的用处。 *

    最佳答案

    因此,因为您没有进行与时间相关的测试,所以仅基于顺序的测试(例如,“我做了这个,然后我做了这个,然后应该是那个”),实际上写一个普通的要简单得多单元测试。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)处单击复选框,然后选择查看您是否处于“加载中”状态,AdvanceTo(10min),然后查看列表是否已更新,并且状态未加载中

    关于wpf - ReactiveUI:从单元测试中测试可观察的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14486541/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com