使用moq进行模拟时的内部类状态

时间:2014-04-08 11:09:14

标签: c# mocking moq

我是嘲笑的新手,我刚刚开始使用moq。该工具声明我们可以使用moq来模拟classes without interfaces。当我想要保持班级的内部状态时,我想知道它是否可行。例如:

//define class for mocking
var mock = new Mock<ILoveThisFramework>();

//define
mock.Setup(framework => framework.DownloadExists("2.0.0.0"))
      .Returns(true)
      .AtMostOnce();

//use mocking tools to call methods and return defined results

问题: 虽然结果已定义,但内部状态(例如私有类变量)是否已更改? (保持班级状态?)

2 个答案:

答案 0 :(得分:1)

我假设您要验证对象的私有或内部状态 - 您正在测试的单位。

在单元测试中,你不应该关心它。私人或内部国家不是你应该测试的东西。你可以,但你不应该。通常公共API和公共状态由单元测试覆盖。

关于这个主题已经有一些很好的答案,我会在那里为您推荐更多选择:

答案 1 :(得分:1)

我假设您在询问是否在模拟上调用DownloadExists会更改模拟的ILoveThisFramework实例的类状态。

答案是否定的。不会调用您的基本方法,只会调用由.Setup()创建的模拟版本。

有一篇很长的博文here详细介绍了一种添加方法来从模拟中调用基本方法的方法,这可能就是你想要做的。

但是,由于该对象被模拟,您通常不关心其他属性以及它们是否正确设置,因为它不是被测试的对象。如果测试对象 关心ILoveThisFramework上的其他属性,那么这些属性也应该被模拟以返回预期结果,而不是依赖于该类的内部工作正常。< / p>