c# - 无法使用 Xunit 在异步方法中断言异常

标签 c# .net-core xunit xunit.net

代码测试中的一些错误引发了这个问题,由于代码的扩展,这里有一个完整的项目,它完全复制了我们遇到的问题(以节省您分析大量行的时间)。

问题是当试图从异步方法中捕获异常时,这里是 AsyncTest.cs文件:

using System;
using Xunit;

namespace AsyncTest
{
    public class AsyncTest
    {
        [Fact]
        public void ProbeTest()
        {
            // Arrange
            var probe = new Probe();

            // Act
            Action action = async () =>
                await probe.GetJob();

            // Assert
            var ex = Assert.Throws<InvalidOperationException>(action);
            Assert.Contains("Trouble with Project.", ex.Message);
        }
    }
}

现在,Probe.cs要测试的类(注意 GetById 方法调用的延迟和异常抛出 GetJob 方法):
using System;
using System.Threading.Tasks;

namespace AsyncTest
{
    class Probe
    {
        public async Task<MyResult<Guid>> GetJob()
        {
            var etlJob = await GetById("id");
            return new MyResult<Guid>(etlJob);
        }

        public async Task<Guid> GetById(string id)
        {
            await Task.Delay(200);

            throw new InvalidOperationException("Trouble with Project.");
        }
    }
}

最后,MyResult.cs Probe.cs 使用的类.
namespace AsyncTest
{
    public class MyResult<T>
    {
        private T _value;

        public MyResult(T Value)
        {
            _value = Value;
        }

        public string Message { get; set; }
        public T Data { get; set; }
    }
}

显然,即使 await Task.Delay(200);,测试也会在抛出异常之前结束。行被删除。在某些情况下,使用多个断点并将调用置于循环中,会抛出异常但测试未检测到。

它看起来像是同步和异步混合,但无法弄清楚到底是什么。

提前致谢。

最佳答案

尝试使您的测试方法异步并等待断言:

    [Fact]
    public async Task ProbeTest()
    {
        // Arrange
        var probe = new Probe();

        // Act
        Func<Task> action = async () => await probe.GetJob();

        // Assert
        var ex = await Assert.ThrowsAsync<InvalidOperationException>(action);
        Assert.Contains("Trouble with Project.", ex.Message);
    }

关于c# - 无法使用 Xunit 在异步方法中断言异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62033219/

相关文章:

c# - 将 wav 文件转换为 8000Hz 16 位单声道 Wav

c# - BlockingCollection 与 Subject 用作​​消费者

c# - Azure Blob Storage SDK 12 通过 GZipStream 压缩文件不起作用

c# - IFormFile 在 dotnet core 2.0 上始终返回 Null 值

asp.net-core - 如何根据环境更改 appSettings.json 文件中的值

java - 在 Java 中调用接受数组或类列表的 Web 服务

c# - Xunit 中类似于 Visual studio 测试中的 TestContext 的属性是什么?

unit-testing - 计数断言

unit-testing - XCTestCase 的意外行为 - 创建不同的实例来运行测试方法

c# - 可以在 C# 中跨多个对象锁定工作吗?