XUnit не ожидает асинхронного теста

В VS 2013, я не могу заставить этот асинхронный тест потерпеть неудачу.

У меня xUnit 1.8.0.1539 (установлен из nuget), с расширением VSU xUnit Test Runner (0.99.5). Все текущие, AFAIK.

У меня также есть ссылка Moq, AutoFixture и FluentAssertions в unit test, но я не думаю, что это имеет значение (но я допускаю это в случае, если это так).

Я провел асинхронные модульные тесты в других областях моего решения, и они работают.

Мне не хватает чего-то с этими недавно созданными тестами, и я не могу сказать, что мне не хватает или что-то не так.

ПРИМЕЧАНИЕ Код 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 не могут быть успешными, поэтому я пришел к выводу, что тест завершается до того, как он завершит получение ответа от SUT.

Что я пропустил?

ИЛИ, есть ли лучший способ, которым я должен был запустить асинхронный тест, чтобы убедиться, что он не работает до написания кода SUT?

Ответ 2

Асинхронные тесты поддерживаются в 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(), чтобы ваш тест завершился неудачно, если он не завершился через определенное время. Как написано, тест может блокироваться бесконечно, если асинхронный метод никогда не завершается.