的xUnit并不总是捕获异步异常

问题描述 投票:0回答:1

我创建了一个测试的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。

当我看到调试信息,在测试失败时,异常仍抛出。

c# async-await xunit
1个回答
0
投票

看起来你做错了什么。 Task.Run只是时间表的工作线程池。也许他们会试图在同一时间打电话Run,也许一会后,其他发生。有一个在你想要做什么固有的竞争条件。

为了解决这个问题,你需要在单元测试来控制Run中的代码和“暂停”它的一些方式。

© www.soinside.com 2019 - 2024. All rights reserved.