gpt4 book ai didi

unit-testing - ReactiveUI - 取消另一个命令 - 文档中代码的单元测试失败

转载 作者:行者123 更新时间:2023-12-04 04:06:48 27 4
gpt4 key购买 nike

我从 ReactiveUi website documentation 中获取代码并尝试对其进行单元测试,但失败了。
它是关于调用一个命令来取消另一个命令。

下面是要测试的类。

public class SomeViewModel : ReactiveObject
{
public SomeViewModel(IScheduler scheduler)
{
this.CancelableCommand = ReactiveCommand
.CreateFromObservable(
() => Observable
.StartAsync(DoSomethingAsync)
.TakeUntil(CancelCommand), outputScheduler: scheduler);
this.CancelCommand = ReactiveCommand.Create(
() =>
{
Debug.WriteLine("Cancelling");
},
this.CancelableCommand.IsExecuting, scheduler);
}

public ReactiveCommand<Unit, Unit> CancelableCommand
{
get;
private set;
}

public ReactiveCommand<Unit, Unit> CancelCommand
{
get;
private set;
}

public bool IsCancelled { get; private set; }

private async Task DoSomethingAsync(CancellationToken ct)
{
try
{
await Task.Delay(TimeSpan.FromSeconds(3), ct);
}
catch (TaskCanceledException)
{
IsCancelled = true;
}
}
}

这是单元测试:

[TestFixture]
[Category("ViewModels")]
public class SomeViewModelFixture
{
public async Task Executing_cancel_should_cancel_cancelableTask()
{
var sut = new SomeViewModel(Scheduler.Immediate);
var t = sut.CancelableCommand.Execute();
await sut.CancelCommand.Execute();

await t;

Assert.IsTrue(sut.IsCancelled);
}
}

CancelCommand 被执行(控制台日志上的断点被命中)但是 Task.Delay 永远不会被取消。 TakeUntil 似乎没有请求取消。

更新
我编辑了上面的代码,以便我的 ViewModel 构造函数采用 IScheduler 并根据 that issue about unit testing 使用它创建命令但测试仍然失败。
我尝试了 nUnit 和 xUnit。
我还尝试按照 that article 在我的测试设置中执行 RxApp.MainThreadScheduler = Scheduler.Immediate但仍然失败。

更新2
从我标记为答案的解决方案和评论来看,最简单的是不在ctor中使用IScheduler,然后像这样编写测试并通过。

[Test]
public async Task Executing_cancel_should_cancel_cancelableTask()
{
var sut = new SomeViewModel();
sut.CancelableCommand.Execute().Subscribe();
await sut.CancelCommand.Execute();

Assert.IsTrue(sut.IsCancelled);
}

最佳答案

这对我有用:

public class SomeViewModelTest
{
SomeViewModel m_actual;

[SetUp]
public void Setup()
{
m_actual = new SomeViewModel(CurrentThreadScheduler.Instance);
m_actual.Activator.Activate();
}

[Test]
public void Executing_cancel_should_cancel_cancelableTask()
{
m_actual.CancelableCommand.Execute().Subscribe();
m_actual.CancelCommand.Execute().Subscribe();

Assert.IsTrue(m_actual.IsCancelled);
}
}

我更改了调度程序以使用与测试本身相同的调度程序,并且我的 ViewModel 确实实现了 ISupportsActivation,我敢说这不会对这里产生任何影响。除此之外,我从测试中删除了 async/await,Rx 不需要它,只需订阅命令即可。

关于unit-testing - ReactiveUI - 取消另一个命令 - 文档中代码的单元测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42303710/

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