13

我正在尝试检查异步方法是否引发了具体异常。

为此,我正在使用 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功能,它将包含在下一个版本 2.1(下周附近)中。

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

4

2 回答 2

17

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

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

    asyncFunction.ShouldNotThrow();
}

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

于 2013-08-15T06:09:39.880 回答
1

如果您查看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();
}
于 2013-08-14T22:51:35.910 回答