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。


当我查看调试信息时,当测试失败时,仍然会引发异常。


冉冉说
浏览 103回答 1
1回答

慕桂英4014372

看起来你做错了什么。 只是将工作安排到线程池。也许他们会试图同时打电话,也许一个接一个地发生。在你试图做的事情中,有一个固有的竞争条件。Task.RunRun为了解决这个问题,你需要一些方法让单元测试来控制其中的代码并“暂停”它。Run
打开App,查看更多内容
随时随地看视频慕课网APP