在fluentassertion上调用异步任务

时间:2018-08-02 20:28:29

标签: c# fluent-assertions

可能是一个简单的方法,但无法使其正常工作;

我已将方法上的签名更改为Task

在单元测试中,我使用的是流利的断言。

但无法使其正常工作

        _catalogVehicleMapper
            .Invoking(m => m.MapToCatalogVehiclesAsync(searchResult, filtersInfo, request, default(CancellationToken)))
            .Should().Throw<ArgumentException>()
            .WithMessage("One of passed arguments has null value in mapping path and can not be mapped");

MapToCatalogVehiclesAsync是异步方法,但是我需要等待它,但是等待并异步调用似乎并没有做到。 某人..?

2 个答案:

答案 0 :(得分:6)

尽管法比奥的答案也是正确的,但您也可以这样做:

_catalogVehicleMapper
   .Awaiting(m => m.MapToCatalogVehiclesAsync(searchResult, filtersInfo, request, default(CancellationToken)))
   .Should().Throw<ArgumentException>()
   .WithMessage("One of passed arguments has null value in mapping path and can not be mapped");

此外,我建议始终在WithMessage中使用通配符。请参见this blog post中的第10点。

答案 1 :(得分:2)

Invoking<T> extensoin方法返回Action,而异步方法等效于async void-因此不会等待异常。

作为解决方法,您可以将测试下的方法包装到Func<Task>上。

[Fact]
public async Task ThrowException()
{
    Func<Task> run = 
        () => _catalogVehicleMapper.MapToCatalogVehiclesAsync(
            searchResult, 
            filtersInfo, 
            request, 
            default(CancellationToken));

    run.Should().Throw<ArgumentException>();
}