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();
}