C# 使用moq模拟时的内部类状态

C# 使用moq模拟时的内部类状态,c#,mocking,moq,C#,Mocking,Moq,我是个新手,刚开始使用moq。该工具声明,我们可以使用moq模拟没有接口的类。我想知道在模拟时是否可以保持类的内部状态。例如: //define class for mocking var mock = new Mock<ILoveThisFramework>(); //define mock.Setup(framework => framework.DownloadExists("2.0.0.0")) .Returns(true) .AtMostOn

我是个新手,刚开始使用moq。该工具声明,我们可以使用moq模拟没有接口的
类。我想知道在模拟时是否可以保持类的内部状态。例如:

//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
//定义用于模拟的类
var mock=new mock();
//定义
mock.Setup(framework=>framework.DownloadExists(“2.0.0.0”))
.Returns(true)
.AtMostOnce();
//使用模拟工具调用方法并返回定义的结果
问题是:
虽然结果已定义,但内部状态(例如私有类变量)是否已更改?(保持类状态?

我假设您想要验证对象的私有或内部状态-您的测试单元

在单元测试中,您不应该关心这一点。私有或内部状态不是您应该测试的东西。你可以,但你不应该。通常公共API和公共状态包含在单元测试中

关于这个话题,已经有了一些很好的答案,我想请您参考更多选项:


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

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

有一篇很长的博客文章详细介绍了一种添加方法,从mock中调用基本方法,这可能就是您想要做的


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

这是一个使用接口的示例,但我将模拟类看看这一个:@oleksii我想验证通过moq调用方法时,该方法修改的类变量是否发生了更改。您是否正在寻找类似于Assert阶段的特定内容?在我的project我需要用另一种方式向您演示模拟。所以我试图找到一种方法来调用一个方法,改变变量,同时模拟对另一个方法的内部调用。非常感谢。