单元测试中设置FirstAction却触发SecondActionCommand,求排查
问题原因与解决方案
你遇到的问题核心是未正确Mock AutoMapper的Map方法,导致其返回null,而Moq的It.IsAny<T>()对于引用类型会匹配null——当Handler调用_mediator.Send(null, ...)时,It.IsAny<FirstActionCommand>()和It.IsAny<SecondActionCommand>()都会匹配这个null参数,让你误以为SecondActionCommand的Send被调用了。
另外,你的测试方法使用async void,这在xUnit中会导致测试无法正确等待异步操作完成,可能引发不稳定的测试结果。
具体修复步骤:
1. Mock AutoMapper的Map方法,返回有效命令实例
在测试的Arrange阶段,明确配置_mapper的Map方法,使其针对FirstActionCommand返回有效实例,避免返回null:
// Arrange var baseActionCommand = new BaseActionCommand() { MyAction = MyAction.FirstAction // 修正笔误:需与Handler中的枚举类型一致 }; // Mock FirstActionCommand的映射逻辑 _mapperStub.Setup(m => m.Map<FirstActionCommand>(baseActionCommand)) .Returns(new FirstActionCommand()); // 可选:配置SecondActionCommand的映射抛出异常,确保不会被意外触发 _mapperStub.Setup(m => m.Map<SecondActionCommand>(It.IsAny<BaseCommand>())) .Throws(new InvalidOperationException("SecondActionCommand的映射不应被执行"));
2. 将测试方法从async void改为async Task
xUnit需要异步测试返回Task才能正确等待异步操作完成:
[Fact] public async Task Handler_Should_Send_FirstActionCommand_Once() // 替换void为Task { // ... 原有测试逻辑 }
3. (可选)优化Verify的匹配精度
为避免后续类型匹配问题,可以使用更精确的匹配器,直接检查实例类型:
// Assert _mediatorStub.Verify(x => x.Send(It.Is<FirstActionCommand>(cmd => cmd.GetType() == typeof(FirstActionCommand)), It.IsAny<CancellationToken>()), Times.Once); _mediatorStub.Verify(x => x.Send(It.Is<SecondActionCommand>(cmd => cmd.GetType() == typeof(SecondActionCommand)), It.IsAny<CancellationToken>()), Times.Never);
内容的提问来源于stack exchange,提问作者user7849697
相关产品推荐
相关产品推荐

