17

我目前正在使用 Moq 框架编写单元测试和模拟依赖项。为此,我创建了一个像这样的 Mock:

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

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

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

现在不用再调用了traceProviderMock.Object,这种新的模拟行为会反映在traceObj? 这就是我想要的情况。

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

我想这样做的原因是因为我使用模拟依赖项在测试设置方法中构建了一个完整的依赖关系图。我只想为我的特定测试更改其中一个模拟依赖项的行为。随后的测试也将他们自己的专业化应用于模拟依赖项。

4

1 回答 1

22

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

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

于 2013-09-04T13:38:56.870 回答