如何断言C#异步方法在单元测试中抛出异常?

时间:2012-09-03 13:17:17

标签: c# unit-testing exception .net-4.5 async-await

  

可能重复:
  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,或者您认为这是一个更好的选择。

4 个答案:

答案 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);
                   }
}