如何将 Assert.Catch 与异步方法一起使用
How to use Assert.Catch with an async method
我刚刚升级到 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' methods are not supported, please use 'async Task' instead
我设法让我的 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
呢?
我遇到了类似的问题,我用 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);
});
我使用自己的 AssertEx.ThrowsAsync
method,因为各种单元测试框架/断言库对 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);
}
A fix is coming 表示 NUnit。不幸的是,他们选择使用异步同步模式来实现它,我认为这是一个错误,以后会回来咬他们。
我刚刚升级到 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' methods are not supported, please use 'async Task' instead
我设法让我的 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
呢?
我遇到了类似的问题,我用 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);
});
我使用自己的 AssertEx.ThrowsAsync
method,因为各种单元测试框架/断言库对 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);
}
A fix is coming 表示 NUnit。不幸的是,他们选择使用异步同步模式来实现它,我认为这是一个错误,以后会回来咬他们。