xUnit没有等待异步测试

时间:2014-04-08 18:15:52

标签: c# unit-testing asynchronous tdd xunit.net

在VS 2013上,我无法让此异步测试失败。

我有xUnit 1.8.0.1539(从nuget安装),xUnit Test Runner VS扩展(0.99.5)。所有最新的,AFAIK。

我碰巧在单元测试中也有Moq,AutoFixture和FluentAssertions参考,但我认为这并不重要(但我承认它是这样的。)

我已在我的解决方案的其他方面完成了异步单元测试,并且它们可以工作。

我在这些新创建的测试中遗漏了一些东西,而且我无法告诉我错过了什么或做错了什么。

注意 SUT代码并不完整。在我编写代码以使测试变为绿色之前,我只是想先获得红灯。

这是测试代码:

using System.Threading.Tasks;
using FluentAssertions;
using Xunit;

namespace MobileApp.Proxy.Test
{
public class WhenRetrievingPriceDataFromClient
{
    [Fact]
    public async Task GroupReportIsReturnedWithSomeData()
    {
        // arrange
        var sut = new Client();

        // act
        var actual = await sut.GetReportGroupAsync();

        // assert

        // Xunit test
        Assert.Null(actual);
        Assert.NotNull(actual);
        // FluentAssertions
        actual.Should().BeNull();
        actual.Should().NotBeNull();
    }
}
}

这是SUT代码:

using System;
using System.Diagnostics;
using System.Net.Http;
using System.Threading.Tasks;
using MobileApp.Proxy.Properties;

namespace MobileApp.Proxy
{
    public class Client
    {
        public async Task<ReportGroup> GetReportGroupAsync()
        {
            return await Task.FromResult(new ReportGroup());
        }
    }
}

显然,这个测试应该失败! Null和NotNull的Asserts都不会成功,所以我的结论是测试在完成从SUT获得响应之前就已退出。

我错过了什么?

或者,有没有更好的方法我应该在编写SUT代码之前启动异步测试以确保它失败?

2 个答案:

答案 0 :(得分:24)

You need xUnit 1.9 async单元测试才能正常工作。

答案 1 :(得分:5)

xUnit v1.9或更高版本支持异步测试。如果您遇到早期版本,则需要执行以下操作:

[Fact]
public void GroupReportIsReturnedWithSomeData()
{
     GroupReportIsReturnedWithSomeDataAsync().Wait();
}

private async Task GroupReportIsReturnedWithSomeDataAsync()
{
    // arrange
    var sut = new Client();

    // act
    var actual = await sut.GetReportGroupAsync();

    // assert

    // Xunit test
    Assert.Null(actual);
    Assert.NotNull(actual);
    // FluentAssertions
    actual.Should().BeNull();
    actual.Should().NotBeNull();
}

基本上,测试方法会阻塞,直到异步测试方法完成,无论是由于成功完成还是故障(例如,断言失败)。在出现故障的情况下,异常将通过Wait()传播到主测试线程。

您可能希望将超时时间传递给Wait(),这样如果在一段时间后没有完成测试,您的测试将会失败。如上所述,如果异步方法永远不会完成,测试可能会无限期地阻塞。