我创建了一个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。
当我查看调试信息时,当测试失败时,仍然会引发异常。
答案 0 :(得分:0)
看起来您做错了什么。 Task.Run
只是将工作安排到线程池中。也许他们会尝试同时拨打Run
,也许一个接一个。您尝试做的事情有一种内在的竞争条件。
要解决此问题,您需要某种方式进行单元测试,以控制Run
中的代码并“暂停”它。