Проверьте возвращаемое значение в синтаксисе исключений FluentAssertion
Я хотел бы проверить возвращаемое значение из метода по синтаксису FluentAssertion. Пожалуйста, рассмотрите следующий фрагмент:
public interface IFoo
{
Task<int> DoSomething();
}
public class Bar
{
private readonly IFoo _foo;
private static int _someMagicNumber = 17;
public Bar(IFoo foo)
{
_foo = foo;
}
public async Task<int> DoSomethingSmart()
{
try
{
return await _foo.DoSomething();
}
catch
{
return _someMagicNumber;
}
}
}
[TestFixture]
public class BarTests
{
[Test]
public async Task ShouldCatchException()
{
// Arrange
var foo = Substitute.For<IFoo>();
foo.DoSomething().Throws(new Exception());
var bar = new Bar(foo);
Func<Task> result = () => bar.DoSomethingSmart();
// Act-Assert
await result.Should().NotThrowAsync();
}
[Test]
public async Task ShouldReturnDefaultValueWhenExceptionWasThrown()
{
// Arrange
var foo = Substitute.For<IFoo>();
foo.DoSomething().Throws(new Exception());
var bar = new Bar(foo);
// Act
var result = await bar.DoSomethingSmart();
// Assert
result.Should().Be(17);
}
}
Моя цель - объединить эти два теста в новый, но я хотел бы сохранить беглую проверку утверждений: result.Should().NotThrowAsync();
Итак, мой вопрос, как проверить в первом тесте, что возвращаемое значение 17
в моем примере?
1 ответ
Решение
Текущая версия Fluent Assertions (5.5.3) не делает различий между Func<Task>
а также Func<Task<T>>
, Оба типа обрабатываются AsyncFunctionAssertions
, который присваивает его Func<Task>
и, следовательно, теряет возвращаемое значение для Task<T>
,
Один из способов обойти это - присвоить возвращаемое значение локальной переменной.
[Test]
public async Task ShouldCatchException()
{
// Arrange
var foo = Substitute.For<IFoo>();
foo.DoSomething().Throws(new Exception());
var bar = new Bar(foo);
// Act
int? result = null;
Func<Task> act = async () => result = await bar.DoSomethingSmart();
// Act-Assert
await act.Should().NotThrowAsync();
result.Should().Be(17);
}
Я создал проблему на трекере проблем Fluent Assertion.