首页 > 解决方案 > 单元测试无限轮询方法

问题描述

我有一个方法,它在应用程序启动时在新任务中启动,并在它结束时停止。该方法每半秒执行一次逻辑。我对如何测试它很迷茫——有什么线索吗?

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

哪里udpDistributernew UdpClient(0)来自 DI 并且_distributionEndPointIPEndPoint

基本上我想检查逻辑是否有效,以及是否以适当的时间间隔发送了正确的数据。如何使用 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

标签: c#asynchronousxunit

解决方案


您验证udpDistributer.Send()(我假设您注入,如果没有注入,则这样做)在您需要的时间内被调用了适当的次数,然后取消令牌。


推荐阅读