为了账号安全,请及时绑定邮箱和手机立即绑定

xUnit 并不总是捕获异步异常

xUnit 并不总是捕获异步异常

C#
冉冉说 2022-08-20 17:30:00
我创建了一个 xUnit 测试,该测试调用了一个方法两次,以确保第二次调用引发异常,指出类实例正忙。非常简单。[Fact]public async Task RunTwice() {    var P = Create();    Task T1 = Task.Run(() => P.Run("test", null));    Task T2 = Task.Run(() => P.Run("test", null));    await Assert.ThrowsAsync<InvalidOperationException>(() => Task.WhenAll(new Task[] { T1, T2 }));}问题是,此测试将随机成功或失败!Run 方法按如下方式启动public IProcess WorkProcess;private readonly object lockToken = new object();public virtual CompletionStatus Run(string fileName, string arguments) {    IProcess P;    lock (lockToken) {        if (WorkProcess != null)            throw new InvalidOperationException();        P = factory.Create();        WorkProcess = P;    }...这是在xUnit中购买还是我做错了什么?我知道在xUnit 1.9中添加了异步支持。我使用的是 v2.4.1。当我查看调试信息时,当测试失败时,仍然会引发异常。
查看完整描述

1 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

看起来你做错了什么。 只是将工作安排到线程池。也许他们会试图同时打电话,也许一个接一个地发生。在你试图做的事情中,有一个固有的竞争条件。Task.RunRun

为了解决这个问题,你需要一些方法让单元测试来控制其中的代码并“暂停”它。Run


查看完整回答
反对 回复 2022-08-20
  • 1 回答
  • 0 关注
  • 101 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号