You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Moq异步事件处理程序Mock异常被隐藏问题咨询

Moq异步事件异常无法被测试捕获的问题

当触发异步事件时,事件内部抛出的异常会被Moq捕获,导致测试无法检测到——这和异步特性有关,异常被存放在Task.Exception中而非直接抛出。

示例代码

internal class Program
{
   static async Task Main(string[] args)
   {
       var eventManager = new EventManager();
       var eventConsumer = new EventConsumer(eventManager);

       await eventManager.OnEventHappened(1000);

       Console.WriteLine("Unreacheble, exception thrown");
   }
}

public delegate Task CustomEvent(int number);

public interface IEventManager
{
   event CustomEvent CustomEvent;
}

public class EventConsumer
{
   private readonly IEventManager _eventManager;

   public EventConsumer(IEventManager eventManager)
   {
       _eventManager = eventManager;

       _eventManager.CustomEvent += _eventManager_CustomEvent;
   }

   private async Task _eventManager_CustomEvent(int number)
   {
       await Task.Delay(number);
       throw new NotImplementedException();
   }
}

public class EventManager : IEventManager
{
   public event CustomEvent CustomEvent;

   public async Task OnEventHappened(int number)
   {
       await CustomEvent.Invoke(number);
   }
}

失败的测试用例

以下测试均未达到预期(预期捕获NotImplementedException,但实际未检测到异常):

[Test]
public void ShouldThrowException()
{
    var eventManagerMock = new Mock<IEventManager>(MockBehavior.Strict);
    var consumer = new EventConsumer(eventManagerMock.Object);

    Assert.Throws<NotImplementedException>(() => eventManagerMock.Raise(x => x.CustomEvent += null, 1000));
}

[Test]
public void ShouldThrowException2()
{
    var eventManagerMock = new Mock<IEventManager>(MockBehavior.Strict);
    var consumer = new EventConsumer(eventManagerMock.Object);

    eventManagerMock.Setup(x => x.OnEventHappened(1000)).Returns(Task.CompletedTask).Raises(x => x.CustomEvent += null, 1000);

    Assert.ThrowsAsync<NotImplementedException>(() => eventManagerMock.Object.OnEventHappened(1000));
}

请问这是我的使用方式有误,还是Moq确实存在该Bug?我已在Moq的GitHub仓库提交Issue,但目前尚未收到回复。

内容的提问来源于stack exchange,提问作者Matheus Lemos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 12:55:29