gpt4 book ai didi

c# - 如何在 NUnit 中测试此 View 模型的异步行为?

转载 作者:太空宇宙 更新时间:2023-11-03 13:33:49 25 4
gpt4 key购买 nike

我的 View 模型有一个公共(public)方法 void StartBroadcastingAndDiscovery()。这会触发两个私有(private)异步方法 Task StartBroadcasting()Task StartDiscovering()。这两个私有(private)方法都是(无休止的)while 循环,如下所示:

while(!ct.IsCancellationRequested)
{
var discovered = await this.networkService.Discover();
this.DiscoveredPeers.Add(discovered);
await Task.Delay(1000);
}

想法是用于发现的异步方法定期轮询网络服务。注入(inject)网络服务:

this.networkService = ServiceContainer.Resolve<INetworkService> ();

模型的用户可以获得已发现节点的列表。随着对等点从网络中出现或消失,该列表可能会随着时间而改变。在某个时刻,用户调用 void StopBroadcastingAndDiscovering()。

为了测试我的 View 模型,我创建了一个模型网络服务,它将“发现”三个不同的点。第一个请求返回第一个对等点,然后是第二个,然后是第三个,然后是第一个,依此类推。

我现在的问题是:如何实际运行测试?我可以在这里测试什么?我希望在 3 秒后看到发现的对等点列表包含三个项目,但我不想对 3 秒延迟进行硬编码。

最佳答案

最简单的解决方案是将 Task.Delay 重构为类中一个单独的、 protected 方法,如下所示:

protected Task Wait()
{
return Task.Delay(1000);
}

然后在您的单元测试中,您从被测系统继承并覆盖 Wait 方法:

protected override Task Wait()
{
return Task.FromResult(true);
}

这样,您的单元测试将调用立即返回的 Wait 的覆盖版本。这会跳过一秒钟的等待,并使您的单元测试更快、更容易控制。

提取到 protected 方法称为创建接缝。您还可以通过使用接口(interface)和依赖项注入(inject)来创建接缝,但对于我来说,对于这种情况,这看起来有点过分了。

关于c# - 如何在 NUnit 中测试此 View 模型的异步行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19402918/

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