对于异步方法/Func,FluentAssessations ShouldNotThrow无法识别

本文关键字:ShouldNotThrow 识别 FluentAssessations 异步方法 Func | 更新日期: 2023-09-27 18:27:54

我正在尝试检查异步方法抛出的具体异常。

为此,我使用MSTEST和FluentAssertions 2.0.1。

我已经查看了Codeplex上的讨论,并了解它如何与异步异常方法一起工作——这是关于FluentAssessations异步测试的另一个链接:

在尝试使用我的"生产"代码一段时间后,我切换到Fluentassertions伪aync类,得到的代码是这样的(将此代码放入[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.HShouldNotThrow(System.Action,string,params object[])'具有一些无效参数

谢谢。


解决方案

2.0.1 FA版本不支持此ShouldNotThrow功能,它将包含在下一个版本2.1中(大约下周)。

注意:ShouldThrow在2.0.1版本中已经得到支持。

对于异步方法/Func,FluentAssessations ShouldNotThrow无法识别

您不需要包罗万象的Action。这仅在单元测试中用于验证API是否抛出了正确的异常。这应该足够了:

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

不幸的是,.NET 4.5中缺少Func上的ShoudlNotThrow()。我已经在2.1版中修复了这个问题(目前是dogfooding)。

如果查看AssertionExtension.cs类,您会发现Func上的ShouldNotThrow扩展方法仅为net45或winrt编译目标定义。

检查此项:

  1. 您的单元测试项目在.net 4.5或winrt上
  2. 引用的断言库是.net 4.5的断言库,如果不尝试更改引用了FluentAssertions库

同样在完成此操作后,我认为您需要调用action方法来进行断言,否则将不会调用内部lambda:

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