2

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

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

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

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

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

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

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

4

1 回答 1

1

Task.Delay最简单的解决方案是在你的类中重构一个单独的、受保护的方法,如下所示:

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

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

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

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

提取到受保护的方法称为创建接缝。您也可以使用接口和依赖注入来创建接缝,但在这种情况下,这对我来说似乎有点过头了。

于 2013-10-16T12:10:51.863 回答