c# - 连续执行多个多线程测试时测试运行停止
问题描述
我有一个带有静态 ConcurrentQueue 的类。一个类接收消息并将它们放入队列中,而该类上的另一个线程从该队列中读取它们并一次处理它们。该方法被取消令牌中止。
清空队列的方法如下所示:
public async Task HandleEventsFromQueueAsync(CancellationToken ct, int pollDelay = 25)
{
while (true)
{
if (ct.IsCancellationRequested)
{
return;
}
if(messageQueue.TryDequeue(out ConsumeContext newMessage))
{
handler.Handle(newMessage);
}
try
{
await Task.Delay(pollDelay, ct).ConfigureAwait(true);
}
catch (TaskCanceledException)
{
return;
}
}
}
我的测试方法如下所示:
CancellationToken ct = source.Token;
Thread thread = new Thread(async () => await sut.HandleEventsFromQueueAsync(ct));
thread.Start();
EventListener.messageQueue.Enqueue(message1);
EventListener.messageQueue.Enqueue(message2);
await Task.Delay(1000);
source.Cancel(false);
mockedHandler.Verify(x => x.Handle(It.IsAny<ConsumeContext>()), Times.Exactly(2));
所以我在它自己的线程中开始我的出队方法,使用一个新的取消令牌。然后我将几条消息排入队列,给进程一秒钟来处理它们,然后使用 source.Cancel(false) 结束线程并使方法返回。然后我检查处理程序的调用次数是否正确。当然,当我中止出队方法时,我正在使用不同的消息类型和不同的时间对此进行测试。
问题是,当我单独运行任何测试时,它们都成功了。但是当我尝试将它们作为一个组运行时,Visual Studio 不会运行每个测试。没有错误消息,并且它运行的测试正常成功,但运行在第二次测试后停止。
我不知道为什么会这样。我的测试在结构上都是相同的。我每次都正确中止出队线程。
什么可以迫使 Visual Studio 停止测试运行而不抛出任何类型的错误?
解决方案
我已经解决了我自己的问题。结果是新创建的线程抛出了异常,当线程抛出异常时,这些异常被忽略,但它们仍然阻止单元测试的发生。修复导致异常的问题后,测试工作正常。
推荐阅读
- java - 'org.springframework.cloud.netflix.zuul.ZuulProxyAutoConfiguration':通过字段'configurers'表达的不满足的依赖关系
- api - 需要为 OroCommerce 创建类别 API
- javascript - 为什么 onPress 不能在世博客户端上工作
- linux - 使用 bash 将从文本文件中删除的行复制回其原始文件
- mongodb - 404 未授权:使用 Realm CLI 进行身份验证:
- java - Junit 模拟泛型类作为方法参数
- r - R Shiny:为不同的数据集创建唯一的数据表
- graphdb - 无论如何要恢复已删除的graphdb存储库吗?
- python - 在python中将带有数值的图例格式化为标签
- python - Python GCP API 无法读取环境值