58

テストを NUnit3 に移植しようとしていますが、System.ArgumentException が発生しています: 'async void' メソッドはサポートされていません。代わりに 'async Task' を使用してください。

[Test]
public void InvalidUsername()
{
    ...
    var exception = Assert.Throws<HttpResponseException>(async () => await client.LoginAsync("notarealuser@example.com", testpassword));
    exception.HttpResponseMessage.StatusCode.ShouldEqual(HttpStatusCode.BadRequest); // according to http://tools.ietf.org/html/rfc6749#section-5.2
    ...
}

Assert.Throws は、次のように定義された TestDelegate を取るように見えます。

public delegate void TestDelegate();

したがって、ArgumentException です。このコードを移植する最善の方法は何ですか?

4

5 に答える 5

99

これは Nunit によって解決されました。Assert.ThrowsAsync<>() を使用できるようになりました

https://github.com/nunit/nunit/issues/1190

例:

Assert.ThrowsAsync<Exception>(() => YourAsyncMethod());
于 2016-03-18T12:43:04.193 に答える
0

例外がスローされたことを確認するには、catch ブロックでアサートすることを選択した場合はアサートしないことをお勧めします。そうしないと、null 参照またはキャッチされていない別の例外が発生するためです。

HttpResponseException expectedException = null;
try
{
    await  client.LoginAsync("notarealuser@example.com", testpassword));         
}
catch (HttpResponseException ex)
{
    expectedException = ex;
}

Assert.AreEqual(HttpStatusCode.NoContent, expectedException.Response.BadRequest);
于 2016-02-04T17:38:31.830 に答える
0

最終的に、NUnit の機能を反映した静的関数を作成しました。これについて、 https://github.com/nunit/nunit/issues/464で全体的な会話がありました。

public static async Task<T> Throws<T>(Func<Task> code) where T : Exception
{
    var actual = default(T);

    try
    {
        await code();
        Assert.Fail($"Expected exception of type: {typeof (T)}");
    }
    catch (T rex)
    {
        actual = rex;
    }
    catch (Exception ex)
    {
        Assert.Fail($"Expected exception of type: {typeof(T)} but was {ex.GetType()} instead");
    }

    return actual;
}

次に、私のテストから、次のように使用できます

var ex = await CustomAsserts.Throws<HttpResponseException>(async () => await client.DoThings());
Assert.IsTrue(ex.Response.StatusCode == HttpStatusCode.BadRequest);
于 2016-02-16T21:42:25.957 に答える
-4

次のようなものを使用してみてください。

 try
 {
     await client.LoginAsync("notarealuser@example.com", testpassword);
 }
 catch (Exception ex)
 {
     Assert.That(ex, Is.InstanceOf(typeof (HttpResponseException)));
 }
于 2015-11-23T22:01:42.937 に答える