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
相关产品推荐
相关产品推荐

