Проверьте возвращаемое значение в синтаксисе исключений FluentAssertion - PullRequest
0 голосов
/ 08 января 2019

Я хотел бы проверить возвращаемое значение из метода с помощью синтаксиса 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 Ответ

0 голосов
/ 08 января 2019

Текущая версия 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.

...