c# – 嵌套的Moq验证
发布时间:2020-12-15 05:36:54 所属栏目:百科 来源:网络整理
导读:我想在最后几个小时弄清楚这个Moq体操.我有以下几个类 – 我正在尝试做一个简单的验证而且它失败了 – 我似乎无法弄清楚为什么. 注意在Moq设置期间,我在请求BeginCounter时返回Mock.Of – 但是当我尝试验证它时它失败了.但是,如果我取消注释行.Setup(e = e.B
我想在最后几个小时弄清楚这个Moq体操.我有以下几个类 – 我正在尝试做一个简单的验证而且它失败了 – 我似乎无法弄清楚为什么.
注意在Moq设置期间,我在请求BeginCounter时返回Mock.Of – 但是当我尝试验证它时它失败了.但是,如果我取消注释行.Setup(e => e.BeginCounter.Increment()),则验证有效. 我错过了什么? public interface IPerformanceCounters { void Increment(); void Decrement(); } public interface IContext { IPerformanceCounters BeginCounter { get; } } public class Test { private readonly IContext context; public Test(IContext context) { this.context = context; } public void React() { this.context.BeginCounter.Increment(); } } void Test() { // ARRANGE var p = new Mock<IContext>(); p.Setup(e => e.BeginCounter).Returns(() => Mock.Of<IPerformanceCounters>()); // This does not work // p.Setup(e => e.BeginCounter.Increment()); // However,this works! // ACT var test = new Test(p.Object); test.React(); // ASSERT p.Verify(v => v.BeginCounter.Increment(),Times.Once()); } 解决方法
我认为这是因为非设置方法无法验证.
据我所知,你正在返回一个模拟,然后尝试验证它.但是,在取消注释设置之前,它不会准备好. void Test() { // ARRANGE var p = new Mock<IContext>(); var perfCountMock = new Mock<IPerformanceCounters>(); p.Setup(e => e.BeginCounter).Returns(() => perfCountMock.Object); // This does not work perfCountMock.Setup(e => e.Increment()); // ACT var test = new Test(p.Object); test.React(); // ASSERT perfCountMock.Verify(v => v.Increment(),Times.Once()); } 以上就是你真正在做的事情.您没有验证IContext调用,而是验证IPerformanceCounters调用.我会这样设置,以便更容易理解,但你可以很容易地取消注释 如果你想保持原样,你需要更好地理解Mock.Of功能. void Test() { // ARRANGE var p = new Mock<IContext>(); var mockOfPerf = Mock.Of<IPerformanceCounters>(); p.Setup(e => e.BeginCounter).Returns(mockOfPerf); // This does not work // ACT var test = new Test1(p.Object); test.React(); // ASSERT Mock.Get(mockOfPerf).Verify(v=>v.Increment(),Times.Once()); } 这与上面的相同,只是使用Mock.Of的预期功能.您无法验证嵌套的模拟,您需要验证实际的模拟 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |