我创建了一个 xUnit 测试,该测试调用了一个方法两次,以确保第二次调用引发异常,指出类实例正忙。非常简单。[Fact]public async Task RunTwice() { var P = Create(); Task T1 = Task.Run(() => P.Run("test", null)); Task T2 = Task.Run(() => P.Run("test", null)); await Assert.ThrowsAsync<InvalidOperationException>(() => Task.WhenAll(new Task[] { T1, T2 }));}问题是,此测试将随机成功或失败!Run 方法按如下方式启动public IProcess WorkProcess;private readonly object lockToken = new object();public virtual CompletionStatus Run(string fileName, string arguments) { IProcess P; lock (lockToken) { if (WorkProcess != null) throw new InvalidOperationException(); P = factory.Create(); WorkProcess = P; }...这是在xUnit中购买还是我做错了什么?我知道在xUnit 1.9中添加了异步支持。我使用的是 v2.4.1。当我查看调试信息时,当测试失败时,仍然会引发异常。
1 回答
慕桂英4014372
TA贡献1871条经验 获得超13个赞
看起来你做错了什么。 只是将工作安排到线程池。也许他们会试图同时打电话,也许一个接一个地发生。在你试图做的事情中,有一个固有的竞争条件。Task.RunRun
为了解决这个问题,你需要一些方法让单元测试来控制其中的代码并“暂停”它。Run
- 1 回答
- 0 关注
- 101 浏览
添加回答
举报
0/150
提交
取消
