13

可能重复:
如何使用 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,否则您会认为这是一个更好的选择。

4

4 回答 4

11

请尝试使用以下标记方法:

[ExpectedException(typeof(NotImplementedException))]
于 2012-09-03T13:21:44.040 回答
10

第一个选项是:

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(); });
于 2012-09-03T13:22:21.980 回答
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();
    }
}
于 2012-09-03T13:23:52.697 回答
0

尝试使用 TPL:

[ExpectedException(typeof(NotImplementedException))]
[TestMethod]
public void TestGetInt()
{
    TaskFactory.FromAsync(client.BeginGetInt, client.EndGetInt, null, null)
               .ContinueWith(result =>
                   {
                       Assert.IsNotNull(result.Exception);
                   }
}
于 2012-09-03T13:26:34.583 回答