c# - 单元测试无限轮询方法
问题描述
我有一个方法,它在应用程序启动时在新任务中启动,并在它结束时停止。该方法每半秒执行一次逻辑。我对如何测试它很迷茫——有什么线索吗?
public async Task StartPoll(CancellationToken token)
{
while(!token.IsCancellationRequested)
{
try
{
var dict = dependecy.getDictionary();
var model = Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(dict));
udpDistributer.Send(model, model.Length, _distributionEndPoint);
}
finally
{
await Task.Delay(500, Token);
}
}
}
哪里udpDistributer
是new UdpClient(0)
来自 DI 并且_distributionEndPoint
是IPEndPoint
基本上我想检查逻辑是否有效,以及是否以适当的时间间隔发送了正确的数据。如何使用 xunit 做到这一点?
编辑
我已经做到了:
// arrange
...
cts = new CancellationTokenSource(timeout);
//act
await sut.StartPoll(cts.Token);
// assert
mockUdpDistributer.Verify(x => x.Send(expectedModel, expectedModel.length,
It.IsAny<IPEndPoint>()), Times.Exactly(expectedTimes));
但是,这会导致测试失败TaskCanceledException
解决方案
您验证udpDistributer.Send()
(我假设您注入,如果没有注入,则这样做)在您需要的时间内被调用了适当的次数,然后取消令牌。
推荐阅读
- asp.net - 无法为 .net 安装“LemmatizerPrebuiltCompact”库 - Visual Studio 错误
- javascript - ReactRedux 我想更新状态,但总是得到“TypeError:无法读取未定义的属性'地址'”相同的代码可以正常更新其他状态
- c++ - 为什么在 WM_NCCREATE 之后 MDI 子窗口不存在?
- sql - Oracle 查询显示错误“不是 GROUP BY 表达式”
- php - 如果php中的两个值相同,如何显示自动选择下一个值?
- r - Lubridate - 查找间隔和日期之间的重叠时间
- python - 如何为 100000 次迭代优化 python 循环?
- javascript - 如何通过ajax从javascript发送和检索数组
- chisel - 创建具有自定义索引范围的连线
- laravel-5 - 我需要跨多个页面使用用户选择的数据,我可以使用哪个模块 Session 或 Cookie