在.Object属性被称为</ity>之后改变Mock <itype>对象

时间:2013-09-04 10:04:07

标签: c# unit-testing mocking moq stubbing

我目前正在使用Moq框架编写单元测试和模拟依赖项。在这样做的过程中,我创建了一个Mock,如下所示:

Mock<ITraceProvider> traceProviderMock = new Mock<ITraceProvider>();
traceProviderMock.Setup(x => x.GetTraceContext(It.IsAny<string>())).Returns("test");
ITraceProvider traceObj = traceProviderMock.Object;

但是后来我想稍微修改模拟的行为,所以我再次在Mock对象上调用Setup

traceProviderMock.Setup(x => x.GetTracer(It.IsAny<string>())).Returns("tracer");

现在没有再次调用traceProviderMock.Object,这个新的模拟行为会反映在traceObj吗?这就是我希望的情况。

这绝对适用于Verify()方法,但似乎不适用于Setup方法。

我想这样做的原因是由于我使用模拟依赖项在Test Setup方法中构建了完整的依赖关系图。我只想更改我的特定测试的一个模拟依赖项的行为。后续测试也会将自己的特化应用于模拟的依赖项。

1 个答案:

答案 0 :(得分:16)

这种行为实际上和我预期的一样。由于我的测试存在问题,我实际上并没有调用新模拟的方法。这误导我相信嘲弄框架没有表现。

总而言之,您可以在调用.Object之后更改模拟,并且更改将反映在模拟对象实例中。