NUnit3: Assert.Throws с асинхронной задачей

Я пытаюсь перенести тест на NUnit3 и получаю исключение System.ArgumentException: методы «async void» не поддерживаются, вместо этого используйте «async Task».

[Test]
public void InvalidUsername()
{
    ...
    var exception = Assert.Throws<HttpResponseException>(async () => await client.LoginAsync("[email protected]", 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. Как лучше всего портировать этот код?


person tikinoa    schedule 19.11.2014    source источник
comment
Связано: stackoverflow.com/questions/15634542/   -  person Marc Gravell    schedule 19.11.2014


Ответы (5)


Это было решено Nunit. Теперь вы можете использовать Assert.ThrowsAsync‹>()

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

Пример:

Assert.ThrowsAsync<Exception>(() => YourAsyncMethod());
person Zabbu    schedule 18.03.2016

Я бы порекомендовал следующий код вместо Assert.ThrowsAsync, так как он более читаем:

// Option A
[Test]
public void YourAsyncMethod_Throws_YourException_A()
{
    // Act
    AsyncTestDelegate act = () => YourAsyncMethod();

    // Assert
    Assert.That(act, Throws.TypeOf<YourException>());
}

// Option B (local function)
[Test]
public void YourAsyncMethod_Throws_YourException_B()
{
    // Act
    Task Act() => YourAsyncMethod();

    // Assert
    Assert.That(Act, Throws.TypeOf<YourException>());
}
person arni    schedule 18.01.2017


Чтобы убедиться, что исключение было выброшено, лучше не утверждать в блоке catch, если вы решите его использовать. Таким образом, вы можете быть уверены, что выбран правильный тип исключения, потому что в противном случае вы получите нулевую ссылку или неперехваченное другое исключение.

HttpResponseException expectedException = null;
try
{
    await  client.LoginAsync("[email protected]", testpassword));         
}
catch (HttpResponseException ex)
{
    expectedException = ex;
}

Assert.AreEqual(HttpStatusCode.NoContent, expectedException.Response.BadRequest);
person BrianPMorin    schedule 04.02.2016

Вы можете попробовать использовать что-то вроде этого:

 try
 {
     await client.LoginAsync("[email protected]", testpassword);
 }
 catch (Exception ex)
 {
     Assert.That(ex, Is.InstanceOf(typeof (HttpResponseException)));
 }
person woitheq    schedule 23.11.2015