Nunit: Assert.Throws 不适用于异步委托

创建于 2016-01-12  ·  9评论  ·  资料来源: nunit/nunit

有了这个测试用例:

using System;
using System.Threading.Tasks;
using NUnit.Framework;

namespace NUnitAsync
{
    [TestFixture]
    public class Class1
    {
        [Test]
        public void MyAsyncThingTest()
        {
            var ioe = Assert.Throws<InvalidOperationException>(async () => await DelayedFailureAsync());
            Assert.That(ioe.Message, Is.EqualTo("ABC"));
        }

        [Test]
        public void MyAsyncThingFluentTest()
        {
            Assert.That(async () => await DelayedFailureAsync(), Throws.Exception.TypeOf<InvalidOperationException>().And.Message.EqualTo("ABC"));
        }

        static async Task DelayedFailureAsync()
        {
            await Task.Delay(TimeSpan.FromSeconds(2)).ConfigureAwait(false);
            throw new InvalidOperationException("ABC");
        }
    }
}

:negative_squared_cross_mark: MyAsyncThingTest失败并出现此异常:

Test Name:  MyAsyncThingTest
Test FullName:  NUnitAsync.Class1.MyAsyncThingTest
Test Source:    C:\Temp\NUnitAsync\NUnitAsync\Class1.cs : line 15
Test Outcome:   Failed
Test Duration:  0:00:00.004

Result StackTrace:  
at NUnit.Framework.Internal.AsyncInvocationRegion.Create(MethodInfo method)
   at NUnit.Framework.Assert.Throws(IResolveConstraint expression, TestDelegate code, String message, Object[] args)
   at NUnit.Framework.Assert.Throws[TActual](TestDelegate code, String message, Object[] args)
   at NUnit.Framework.Assert.Throws[TActual](TestDelegate code)
   at NUnitAsync.Class1.MyAsyncThingTest() in C:\Temp\NUnitAsync\NUnitAsync\Class1.cs:line 16
Result Message: System.ArgumentException : 'async void' methods are not supported, please use 'async Task' instead

:white_check_mark: MyAsyncThingFluentTest通过。

为什么会有差异? Assert.Throws返回异常以进行进一步测试,这是Assert.That样式不提供的有用功能。

duplicate

最有用的评论

Stackoverflow 把我带到了这里。 做得好!! 我在 NuGet 中更新到了 3.20 版本并且可以使用 Assert.ThrowsAsyc 函数!

所有9条评论

谢谢你的报告。 我已确认并将其指定为高优先级问题。 两个实例都采用 TestDelegate,因此它们的行为应该相同。

至于为什么Assert.That不返回异常,是因为我们不知道根据签名你要使用哪个约束。 编写像Assert.That(async () => await One(), Is.EqualTo(1)));这样流畅的断言是很常见的,这与您正在调用的方法相同。

有趣的是,这似乎只是 throws 约束的问题。 其他约束工作,

``` C#
[测试]
public void TestTheMeaningOfLife()
{
Assert.That(async () => await DelayedMeaningOfLife(), Is.EqualTo(42));
}

静态异步任务DelayedMeaningOfLife()
{
await Task.Delay(TimeSpan.FromSeconds(2)).ConfigureAwait(false);
返回 42;
}
```

throws 约束的问题是什么意思? 除非Assert.Throws在内部使用它,否则 throws 约束( Assert.That(..., Throws...) )会起作用。 Assert.Throws不起作用。

如果Assert.That适用于Throws我希望它也适用于Is.EqualTo和朋友。

我的错误,我误读了哪个测试失败了,甚至误读了我的哪个测试失败了。 所以我对约束的评论是不正确的。 Assert.Throws 是少数几个不链接到其等效约束的经典断言之一。

由 #1142 修复,但我们需要记录。

谢谢。

我无法从 #1142 的更改中看到,但是错误消息(“不支持异步无效方法”)是否仍然存在,或者错误是否表明开发人员应该使用Assert.ThrowsAsync代替?

@yaakov-h,是的,一旦我们发布下一个版本,就应该改用 Assert.ThrowsAsync。 现在,使用流畅的语法。

Stackoverflow 把我带到了这里。 做得好!! 我在 NuGet 中更新到了 3.20 版本并且可以使用 Assert.ThrowsAsyc 函数!

正是我要找的。 谢谢。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

fluffynuts picture fluffynuts  ·  3评论

dgm90 picture dgm90  ·  5评论

TobiasSekan picture TobiasSekan  ·  4评论

ChrisMaddock picture ChrisMaddock  ·  3评论

Thaina picture Thaina  ·  5评论