我怎么可以断言,一个C#异步方法抛出一个单元测试的异常? [重复](How can I asse

2019-07-31 08:34发布

可能重复:
如何与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();
    }
}    

此代码段定义了一个测试TestGetIntAsyncAsyncClass.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,如果必要的话,还是会认为这是一个更好的选择。

Answer 1:

请尝试标记方法有:

[ExpectedException(typeof(NotImplementedException))]


Answer 2:

第一个选择是:

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(); });


Answer 3:

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();
    }
}


Answer 4:

尝试使用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]