可能重复:
How do I test an async method with NUnit, eventually with another framework?
我想知道的是如何断言异步方法在C#单元测试中抛出异常?我能够在Visual Studio 2012中使用Microsoft.VisualStudio.TestTools.UnitTesting
编写异步单元测试,但还没有弄清楚如何测试异常。我知道xUnit.net也以这种方式支持异步测试方法,虽然我还没有尝试过那个框架。
关于我的意思的一个例子,下面的代码定义了被测系统:
using System;
using System.Threading.Tasks;
public class AsyncClass
{
public AsyncClass() { }
public Task<int> GetIntAsync()
{
throw new NotImplementedException();
}
}
此代码段为TestGetIntAsync
定义了测试AsyncClass.GetIntAsync
。这是我需要输入如何完成GetIntAsync
抛出异常的断言的地方:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Threading.Tasks;
[TestClass]
public class TestAsyncClass
{
[TestMethod]
public async Task TestGetIntAsync()
{
var obj = new AsyncClass();
// How do I assert that an exception is thrown?
var rslt = await obj.GetIntAsync();
}
}
如果需要,可以随意使用一些其他相关的单元测试框架而不是Visual Studio,例如xUnit.net,或者您认为这是一个更好的选择。
答案 0 :(得分:10)
请尝试用以下方法标记方法:
[ExpectedException(typeof(NotImplementedException))]
答案 1 :(得分:7)
第一个选项是:
try
{
await obj.GetIntAsync();
Assert.Fail("No exception was thrown");
}
catch (NotImplementedException e)
{
Assert.Equal("Exception Message Text", e.Message);
}
第二个选项是使用预期异常属性:
[ExpectedException(typeof(NotImplementedException))]
第三种选择是使用Assert.Throws:
Assert.Throws<NotImplementedException>(delegate { obj.GetIntAsync(); });
答案 2 :(得分:2)
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Threading.Tasks;
[TestClass]
public class TestAsyncClass
{
[TestMethod]
[ExpectedException(typeof(NotImplementedException))]
public async Task TestGetIntAsync()
{
var obj = new AsyncClass();
// How do I assert that an exception is thrown?
var rslt = await obj.GetIntAsync();
}
}
答案 3 :(得分:0)
尝试使用TPL:
[ExpectedException(typeof(NotImplementedException))]
[TestMethod]
public void TestGetInt()
{
TaskFactory.FromAsync(client.BeginGetInt, client.EndGetInt, null, null)
.ContinueWith(result =>
{
Assert.IsNotNull(result.Exception);
}
}