xUnit并不总是捕获异步异常

时间:2019-02-03 04:03:32

标签: c# async-await xunit

我创建了一个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 个答案:

答案 0 :(得分:0)

看起来您做错了什么。 Task.Run只是将工作安排到线程池中。也许他们会尝试同时拨打Run,也许一个接一个。您尝试做的事情有一种内在的竞争条件。

要解决此问题,您需要某种方式进行单元测试,以控制Run中的代码并“暂停”它。