Moq验证失败:期望Mock调用至少一次却未执行问题求助
解决Moq验证失败:Mock方法未被调用的问题
你遇到的这个Moq异常,核心原因其实很直白:你的Publisher类根本没调用注入的MyPublisher实例的GetMessageCount方法,所以你在测试里设置的Mock验证自然找不到对应的调用记录。
咱们一步步拆解问题:
1. 异常背后的真相
异常提示Expected invocation on the mock at least once, but was never performed,意思是你要求Mock的GetMessageCount必须被调用至少一次,但实际运行时根本没触发这个方法。
看一下你的Publisher类实现:
public long GetMessageCount(string msg) { long result = 0; try { if (msg == "abc") throw new Exception(); return result; } catch (Exception ex) { var p = ex.Message; return result = -1; } }
这段代码全程都是自己处理逻辑——判断msg是"abc"就抛异常,然后返回-1,完全没用到构造函数里注入的MyPublisher私有字段。你的Mock对象就像个摆设,根本没被调用,Moq当然会报错。
2. 修正Publisher类的实现
你的Publisher应该是一个依赖委托类,它的职责应该是调用注入的IPublisher实例的方法,然后处理异常或添加额外逻辑,而不是自己实现核心逻辑。修正后的代码应该是这样:
public class Publisher : IPublisher { private IPublisher MyPublisher { get; set; } public Publisher(IPublisher publisher) { MyPublisher = publisher; } public long GetMessageCount(string msg) { try { // 核心逻辑委托给注入的MyPublisher return MyPublisher.GetMessageCount(msg); } catch (Exception ex) { var p = ex.Message; return -1; } } }
3. 调整测试代码匹配业务逻辑
现在Publisher会真正调用Mock的方法了,你需要调整测试来模拟业务场景:当传入"abc"时,Mock的GetMessageCount抛出异常,然后验证Publisher返回-1,同时验证Mock方法确实被调用了。
修正后的测试代码:
[TestMethod] public void ShouldReturnNegativeWhenMsgIsInvalid1() { string msg = "abc"; // 模拟:当传入"abc"时,Mock的方法抛出异常 myPublisherMock.Setup(m => m.GetMessageCount(msg)).Throws(new Exception()); // 调用被测试方法 long result = publisher.GetMessageCount(msg); // 验证返回值是否符合预期 Assert.AreEqual(-1, result); // 验证Mock的方法确实被调用了一次 myPublisherMock.Verify(m => m.GetMessageCount(msg), Times.Once); }
总结
你之前的问题完全是因为Publisher类没有正确使用依赖注入的实例,导致Mock对象从未被触发。修正依赖调用逻辑后,测试就能正常验证了。
内容的提问来源于stack exchange,提问作者CodeDada
相关产品推荐
相关产品推荐

