有了这个测试用例:
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
样式不提供的有用功能。
谢谢你的报告。 我已确认并将其指定为高优先级问题。 两个实例都采用 TestDelegate,因此它们的行为应该相同。
至于为什么Assert.That不返回异常,是因为我们不知道根据签名你要使用哪个约束。 编写像Assert.That(async () => await One(), Is.EqualTo(1)));
这样流畅的断言是很常见的,这与您正在调用的方法相同。
有趣的是,这似乎只是 throws 约束的问题。 其他约束工作,
``` C#
[测试]
public void TestTheMeaningOfLife()
{
Assert.That(async () => await DelayedMeaningOfLife(), Is.EqualTo(42));
}
静态异步任务
{
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 函数!
正是我要找的。 谢谢。
最有用的评论
Stackoverflow 把我带到了这里。 做得好!! 我在 NuGet 中更新到了 3.20 版本并且可以使用 Assert.ThrowsAsyc 函数!