我创建了一个测试的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。
当我看到调试信息,在测试失败时,异常仍抛出。
看起来你做错了什么。 Task.Run
只是时间表的工作线程池。也许他们会试图在同一时间打电话Run
,也许一会后,其他发生。有一个在你想要做什么固有的竞争条件。
为了解决这个问题,你需要在单元测试来控制Run
中的代码和“暂停”它的一些方式。