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 : 'async void' メソッドはサポートされていません。代わりに 'async Task' を使用してください

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

同様の問題があり、void リターンを Task に置き換えたので、

交換してみる

[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 に答える