3

我刚刚升级到 NUnit 3,但在让我的单元测试通过时遇到了一些麻烦。

[Test]
public void GetSomethingAsync_CallsConverter()
{
    int id = 123;

    Assert.Catch<NullReferenceException>(
        async () => await _repository.GetSomethingAsync(id));

    _fooMock.Verify(f => f.Bar(id), Times.Once);
}

NUnit 给了我这个错误:

System.ArgumentException:不支持“异步无效”方法,请改用“异步任务”

我设法让我Assert.Throws通过改变它这样的:

    Assert.Throws<NullReferenceException>(
        async () => await _repository.GetSomethingAsync(id));
//to
    Assert.That(
        async () => await _repository.GetSomethingAsync(id),
        Throws.InstanceOf<NullReferenceException>());

但是没有类似的等价物Assert.Catch
那么我们应该如何使用Assert.Catch异步方法呢?

4

2 回答 2

4

我有一个类似的问题,我用 Task 替换了 void return 所以

尝试更换

[Test]
public void GetSomethingAsync_CallsConverter()

[Test]
public async Task GetSomethingAsync_CallsConverter()

下面是我们如何测试异步调用的示例

[Test]
public async System.Threading.Tasks.Task Integration_Get_Invalid_ReturnsUnauthorized()
{
    // ARRANGE
    const string url = "/api/v2/authenticate/999/wrongName/wrongPassword";

    // ACT
    var result = await Get(url);

    // ASSERT
    Assert.IsFalse(result.HttpResponseMessage.IsSuccessStatusCode); 
}

如果要测试是否引发了异常,请使用以下命令

Assert.Throws<ValidationException>(() =>
{
    var user = await _service.Get(2);
 });
于 2016-02-23T14:28:57.027 回答
2

我使用我自己的AssertEx.ThrowsAsync方法,因为各种单元测试框架/断言库对以下方面的支持量不同async

[Test]
public async Task GetSomethingAsync_CallsConverter()
{
  int id = 123;

  await AssertEx.ThrowsAsync<NullReferenceException>(
      async () => await _repository.GetSomethingAsync(id));

  _fooMock.Verify(f => f.Bar(id), Times.Once);
}

NUnit即将修复。不幸的是,他们选择使用异步同步模式来实现它,我认为这是一个错误,稍后会再次咬他们。

于 2016-02-23T14:50:06.213 回答