xUnit и Moq не поддерживают async - ожидайте ключевых слов

Я пытаюсь понять, как применить ключевые слова async и await к моим тестам xUnit. Я использую xUnit 1.9 и Async CTP 1.3. Вот мой тестовый случай

У меня есть интерфейс, который указывает один асинхронный вызов метода

public interface IDoStuffAsync
{
    Task AnAsyncMethod(string value);
}

У меня есть класс, который потребляет интерфейс и вызывает асинхронный метод

public class UseAnAsyncThing
{
    private readonly IDoStuffAsync _doStuffAsync;

    public UseAnAsyncThing(IDoStuffAsync doStuffAsync)
    {
        _doStuffAsync = doStuffAsync;
    }

    public async Task DoThatAsyncOperation(string theValue)
    {
        await _doStuffAsync.AnAsyncMethod(theValue);
    }
}

В моих тестах я хочу проверить, что метод DoThatAsyncOperationвызывает метод с правильным значением, поэтому я имитирую интерфейс и использую Moq для проверки вызова

    [Fact]
    public async void The_test_will_pass_even_though_it_should_fail()
    {
        var mock = new Mock<IDoStuffAsync>();
        var sut = new UseAnAsyncThing(mock.Object);

        mock.Setup(x => x.AnAsyncMethod(It.IsAny<string>()));

        await sut.DoThatAsyncOperation("test");

        // This won't throw a Moq.MockExcpetion so the test appears to pass
        // However it does not run
        mock.Verify(x => x.AnAsyncMethod("fail"));
    }

Этот тест использует asyncи ждатьключевых слов. Когда он запускается, он ошибочно проходит, так как Moq должен утверждать, что проверка не удалась. Любой код после вызова на sut. DoThatAsyncOperation("test"); не выполняется

    [Fact]
    public void This_will_work_and_assert_the_reslt()
    {
        var mock = new Mock<IDoStuffAsync>();
        var sut = new UseAnAsyncThing(mock.Object);

        mock.Setup(x => x.AnAsyncMethod(It.IsAny<string>()));

        sut.DoThatAsyncOperation("test").ContinueWith(y => { });

        // This won't throw a Moq.MockExcpetion so the test appears to pass
        // However it does not run
        mock.Verify(x => x.AnAsyncMethod("fail"));
    }

Этот тест настраивается без ключевых слов await и async и проходит нормально.

Является ли это ожидаемым поведением для xUnit и Moq?


Обновление

Спасибо за комментарий Стивена, мне удалось исправить первый тест, внеся два изменения. Тест теперь возвращает задачу вместо void, а макет также возвращает задачу.

    [Fact]
    public async Task The_test_will_pass_even_though_it_should_fail()
    {
        var mock = new Mock<IDoStuffAsync>();
        var sut = new UseAnAsyncThing(mock.Object);

        mock.Setup(x => x.AnAsyncMethod(It.IsAny<string>())).ReturnAsync(true);

        await sut.DoThatAsyncOperation("test");

        // This now fails as it should
        mock.Verify(x => x.AnAsyncMethod("fail"));
    }
19
задан Paul Hatcher 17 April 2016 в 18:20
поделиться