FluentAssertions ShouldNotThrow не распознается для асинхронного метода/Func

Я пытаюсь проверить метод async, создавая конкретное исключение.

Для этого я использую MSTEST и FluentAssertions 2.0.1.

Я проверил этот Обсуждение на Codeplex и посмотрел, как он работает с асинхронными исключениями, эта другая ссылка о Тесты асинхронного тестирования FluentAssertions:

По прошествии некоторого времени, пытаясь работать с моим "производственным" кодом, я переключился на поддельный класс aync Fluentassertions, и полученный в результате код выглядит так (поместите этот код внутри [TestClass]:

[TestMethod]
public void TestThrowFromAsyncMethod()
{
    var asyncObject = new AsyncClass();
    Action action = () =>
    {
        Func<Task> asyncFunction = async () =>
        {
            await asyncObject.ThrowAsync<ArgumentException>();
        };
        asyncFunction.ShouldNotThrow();
    };
}


internal class AsyncClass
{
    public async Task ThrowAsync<TException>()
        where TException : Exception, new()
    {
        await Task.Factory.StartNew(() =>
        {
            throw new TException();
        });
    }

    public async Task SucceedAsync()
    {
        await Task.FromResult(0);
    }
}

Проблема заключается в том, что ShouldNotThrow недействителен:

Метод ShouldNotThrow не распознается кодом. Если я попытаюсь компиляция, это дает мне эту ошибку: "System.Func" не содержит определение "ShouldNotThrow" и лучшая перегрузка метода расширения "FluentAssertions.AssertionExtensions.ShouldNotThrow(System.Action, string, params object []) 'имеет некоторые недопустимые аргументы

Спасибо.


РЕШЕНИЕ

2.0.1 Версия FA не поддерживает эту функциональность ShouldNotThrow, и она будет включена в следующий релиз 2.1 (около следующей недели).

Примечание. ShouldThrow уже поддерживается в версии 2.0.1.

Ответ 1

Вам не нужно охватывать действие. Это используется только в модульных тестах, чтобы убедиться, что API выбрасывает правильное исключение. Этого должно быть достаточно:

[TestMethod]
public void TestThrowFromAsyncMethod()
{
    Func<Task> asyncFunction = async () =>
    {
        await asyncObject.ThrowAsync<ArgumentException>();
    };

    asyncFunction.ShouldNotThrow();
}

К сожалению, в .NET 4.5 отсутствует ShoudlNotThrow() на Func. Я исправил это в версии 2.1 (в настоящее время это собака).

Ответ 2

Если вы посмотрите класс AssertionExtensions.cs, вы увидите, что метод расширения ShouldNotThrow для Func определен только для целей компиляции net45 или winrt.

Проверьте это:

  • Проект ваших модулей тестирования включен .net 4.5 или winrt
  • Связанная библиотека утверждений -.net 4.5, если не пытаться изменить ссылка на библиотеку FluentAssertions на правильную.

И после этого, я думаю, вам нужно вызвать метод действия для выполнения утверждения, иначе внутренняя лямбда не будет вызвана:

[TestMethod]
public void TestThrowFromAsyncMethod()
{
    var asyncObject = new AsyncClass();
    Action action = () =>
    {
        Func<Task> asyncFunction = async () =>
        {
            await asyncObject.ThrowAsync<ArgumentException>();
        };
        asyncFunction.ShouldNotThrow();
    };

    action.ShouldNotThrow();
}