问题 对于异步方法/ Func,无法识别FluentAssertions ShouldNotThrow


我试图检查异步方法抛出具体异常。

为此我使用的是MSTEST和FluentAssertions 2.0.1。

我检查了这个 关于Codeplex的讨论 并看看它如何与异步异常方法一起使用另一个链接 FluentAssertions异步测试

尝试使用我的'生产'代码一段时间后,我已经关闭了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.ShouldNotThrow(System.Action,   string,params object [])'有一些无效的参数

谢谢。


2.0.1 FA版本不支持此功能 ShouldNotThrow 功能,它将包含在下一个reléase2.1(下周附近)。

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


3753
2017-08-14 19:11


起源

我对FluentAssertions一无所知,但例外情况说只定义了ShouldNotThrow Action 并不是 Func。 - Keith Payne
@KeithPayne这意味着FluentAsseritions可能不支持 async。 - svick
FluentAssertions支持异步,如果您阅读上面的链接(链接),您可以看到它。这个也可以帮助: fluentassertions.codeplex.com/workitem/12148 - ferpega
@ferpega:您是否在单元测试项目中使用.NET 4.5?如果是这样,请尝试卸载FA并重新安装。 - Stephen Cleary
@StephenCleary:目标是.NET 4.5 FluentAssertions是Nuget托管的,运行时版本属性是:v4.0.30319 - ferpega


答案:


您不需要包含操作。这仅用于单元测试,以验证API是否正在抛出正确的异常。这应该足够了:

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

    asyncFunction.ShouldNotThrow();
}

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


15
2017-08-15 06:09



发布代码时,请突出显示并点击 {} 按钮(如果需要练习,则手动将每行缩进四个空格)。 - Damien_The_Unbeliever
@DennisDoomen我知道,我只是在编写与FA相同的代码。但如果我的框架已经是4.5为什么FA安装4.0 ....与nuget? - ferpega
@DennisDoomen我的意思是,FA是Runtime版本 4.0.30319 它已经位于 net45 这个完整路径的文件夹: ....\packages\FluentAssertions.2.0.1\lib\net45\FluentAssertions.dll。但不是 ShouldNotThrow 是可用的。 - ferpega
嗯。我需要尝试一下。 4.0.30319 = .NET 4.5 - Dennis Doomen
如果将这种方法暴露为“异步”,那将是很好的,因此可以等待它。 VS和Resharper都抱怨没有正确执行await / async。请参阅MS的Assert.ThrowsExceptionAsync() - Jason Coyne


如果你看看 AssertionExtensions.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();
}

1
2017-08-14 22:51



目标是4.5,但运行时间是:v4.0.30319。 FluentAssertions是Nuget Managed。 - ferpega
请检查引用的FluentAssertions库是否来自nuget包文件夹中名为“net45”的正确文件夹。 - Iñaki Elcoro
在即将发布的FA 2.1中,.NET 4.0将支持这些扩展方法 - Dennis Doomen
@DennisDoomen我很不耐烦。 :-) - ferpega
@iCe:是的,FluentAssertions库就在 net45 夹。 - ferpega