在异步委托中断言异常

5

我正在使用 NUnit 3。我编写了一个扩展方法:

public static T ShouldThrow<T>(this TestDelegate del) where T : Exception {
  return Assert.Throws(typeof(T), del) as T;
}

这使我能够做到这一点:

TestDelegate del = () => foo.doSomething(null);
del.ShouldThrow<ArgumentNullException>();

现在我希望异步操作也有类似的功能:
AsyncTestDelegate del = async () => await foo.doSomething(null);
del.ShouldThrowAsync<ArgumentNullException>();

所以我写了这个:
public static async Task<T> ShouldThrowAsync<T>(this AsyncTestDelegate del) where T : Exception {
  return (await Assert.ThrowsAsync(typeof(T), del)) as T;
}

但是这并不起作用:'Exception' 不包含 'GetAwaiter' 的定义,也没有接受类型为 'Exception' 的第一个参数的扩展方法 'GetAwaiter' 可用(是否缺少 using 指令或程序集引用?)

我做错了什么?

1个回答

10
据我所知,Assert.ThrowsAsync没有返回一个Task,因此无法使用await。请从您的扩展方法中删除await
public static T ShouldThrowAsync<T>(this AsyncTestDelegate del) where T : Exception {
  return Assert.ThrowsAsync(typeof(T), del) as T;
}

以下是使用示例,参见文档。请注意,Assert.ThrowsAsync返回一个MyException,并且await在委托中。

[TestFixture]
public class UsingReturnValue
{
  [Test]
  public async Task TestException()
  {
    MyException ex = Assert.ThrowsAsync<MyException>(async () => await MethodThatThrows());

    Assert.That( ex.Message, Is.EqualTo( "message" ) );
    Assert.That( ex.MyParam, Is.EqualTo( 42 ) ); 
  }
}

是的,我自动地假设因为它是一个委托,所以断言需要被等待...哎呀! - h bob
1
根据微软的命名规范,它本应该是这样的。 ;) - smoksnes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接