我应该在生产代码中使用模拟吗?

Avr*_*ram 11 moq mocking

我有一种情况需要在生产中模拟一些代码.这是用于制作代码的一部分,使用一半功能.

我必须选择编写一个空类(实现接口),或使用像moq这样的模拟系统.

所以问题是,模拟系统是否会影响性能,或者破坏生产代码的可读性

更新
示例:

interface IRocketSystem
{
   void LaunchTheRocket();
}

class SimulationRocketSystem:IRocketSystem
{
...
}

class RocketSystem:IRocketSystem
{
...
}
Run Code Online (Sandbox Code Playgroud)

我发现我在生产中有一个SimulationRocketSystem类,那个小而且在体内没有很多.模拟系统有一行代码(新的Mock <IRocketSystem>().Object)来替换这样的类.

模仿的优点:
项目中的空类较少.

wax*_*ing 10

听起来像一个空对象.出于两个原因,我不相信使用模拟框架.

首先,它会损害可读性.使用适当命名的空类实现接口,然后记录该类中的intent.另一方面,如果使用模拟框架,则需要将文档嵌入代码中的某个位置.此外,它会让人感到困惑,因为人们倾向于期望测试代码中存在模拟而不理解使用模拟的意图.

其次,你必须考虑如果某人修改了界面会发生什么.如果添加方法怎么办?它应该默认返回null - 正如一些框架那样吗?如果方法必须根据接口契约返回某个特定的返回值,该怎么办?如果你有一个具体的实现,那么编译器至少会对你有所保护.如果你使用模拟框架,你可能会失败.


Bri*_*sen 9

模拟对象是您用于测试的东西,因为它会让您声明它被正确调用.听起来你正在寻找的东西更像是存根或代理对象.

既然你最终会实现有问题的类,那么让一个模拟框架为你做IMO是没有意义的.为什么不创建类并根据需要实现它.


S.L*_*ott 6

空课有什么问题?

实际上,它将被一个真正的类所取代,所以你也可以从一个真实的类开始.

我认为测试之外放置任何类型的模拟代码都是一个糟糕的策略.