我是嘲笑的新手,我刚刚开始使用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
问题: 虽然结果已定义,但内部状态(例如私有类变量)是否已更改? (保持班级状态?)
答案 0 :(得分:1)
我假设您要验证对象的私有或内部状态 - 您正在测试的单位。
在单元测试中,你不应该关心它。私人或内部国家不是你应该测试的东西。你可以,但你不应该。通常公共API和公共状态由单元测试覆盖。
关于这个主题已经有一些很好的答案,我会在那里为您推荐更多选择:
答案 1 :(得分:1)
我假设您在询问是否在模拟上调用DownloadExists
会更改模拟的ILoveThisFramework
实例的类状态。
答案是否定的。不会调用您的基本方法,只会调用由.Setup()
创建的模拟版本。
有一篇很长的博文here详细介绍了一种添加方法来从模拟中调用基本方法的方法,这可能就是你想要做的。
但是,由于该对象被模拟,您通常不关心其他属性以及它们是否正确设置,因为它不是被测试的对象。如果测试对象 关心ILoveThisFramework
上的其他属性,那么这些属性也应该被模拟以返回预期结果,而不是依赖于该类的内部工作正常。< / p>