gpt4 book ai didi

c# - 单元测试预期在 MSTest 上调用异步操作时抛出异常

转载 作者:行者123 更新时间:2023-11-30 16:27:44 25 4
gpt4 key购买 nike

下面的源代码是关于我的问题的示例代码片段。我希望在调用异步操作时发生异常。

单元测试

[TestMethod()]
[ExpectedException(typeof(Exception))]
public void OperateAsyncTest()
{
//Arrange
var testAsyncClass = new TestAsyncClass();
//Act
testAsyncClass.OperateAsync();
}

代码

public class TestAsyncClass
{
public void OperateAsync()
{
ThreadPool.QueueUserWorkItem( obj =>{
throw new Exception("an exception is occurred.");
});
}
}

但是,MsTest 无法捕获异常,因为测试线程可能与抛出异常的线程不同。 这个问题是怎么解决的?有什么想法吗?

下面的代码是我的解决方法,但它既不聪明也不优雅。

解决方法

[TestClass()]
public class TestAsyncClassTest
{
private static Exception _exception = new Exception();
private static readonly EventWaitHandle ExceptionWaitHandle = new AutoResetEvent(false);

static TestAsyncClassTest()
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
_exception = (Exception)e.ExceptionObject;
ExceptionWaitHandle.Set();
}


[TestMethod()]
[ExpectedException(typeof(Exception))]
public void OperateAsyncTest()
{
//Arrange
var testAsyncClass = new TestAsyncClass();
//Act
lock(_exception)
{
testAsyncClass.OperateAsync();
ExceptionWaitHandle.WaitOne();
throw _exception;
}
}
}

最佳答案

也许您可以将您的异步操作实现为一个Task,从OperateAsync 返回它,然后从调用者返回Task.Wait

Task.Wait 将“观察”异常,以便您的单元测试可以检测到它(前提是您用 ExpectedException 属性装饰它)。

代码看起来像这样:

public class TestAsyncClass {

public Task OperateAsync() {
return Task.Factory.StartNew(
() => {
throw new Exception("an exception is occurred.");
}
);
}

}

[TestClass]
public class TestAsyncClassTest {

[TestMethod]
[ExpectedException(typeof(AggregateException))]
public void OperateAsyncTest() {
var testAsyncClass = new TestAsyncClass();
testAsyncClass.OperateAsync().Wait();
}

}

请注意,您将从 Task.Wait 中获得一个 AggregateException。它的 InnerException 将是您从 OperateAsync 抛出的异常。

关于c# - 单元测试预期在 MSTest 上调用异步操作时抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7617494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com