可能重复:
如何与NUnit的另一个框架测试一个异步方法,最后?
我想知道的是,我怎么能断言异步方法抛出一个异常,在C#单元测试? 我能写异步单元测试Microsoft.VisualStudio.TestTools.UnitTesting
在Visual Studio 2012,但还没有想出如何测试例外。 我知道,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,如果必要的话,还是会认为这是一个更好的选择。
请尝试标记方法有:
[ExpectedException(typeof(NotImplementedException))]
第一个选择是:
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(); });
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();
}
}
尝试使用TPL:
[ExpectedException(typeof(NotImplementedException))]
[TestMethod]
public void TestGetInt()
{
TaskFactory.FromAsync(client.BeginGetInt, client.EndGetInt, null, null)
.ContinueWith(result =>
{
Assert.IsNotNull(result.Exception);
}
}
文章来源: How can I assert that a C# async method throws an exception in a unit test? [duplicate]