为什么在Rspec中使用any_instance_of会产生代码气味?

时间:2016-01-17 01:52:43

标签: rspec

此处没有很多在线资源,但最接近答案的是relishapp.com网站:

  

rspec-mocks API是为单个对象实例设计的,但是   此功能适用于整个对象类。结果那里   是一些语义混乱的边缘情况。例如,在   expect_any_instance_of(Widget)。接收(:name).twice它不清楚   是否希望特定实例接收名称两次,或者是否   预计两个收到总数。 (它是前者。)

但是,如果您正确使用context / describe块来限定用例范围,则根本不存在此问题。

使用它有什么负面影响吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

尽管使用any_instance似乎非常方便且易于使用,但随着测试套件的增长,它确实会引起混淆。方法调用期望主要用于单元样式测试,您应该完全控制测试主题使用的依赖项。如果您正在使用expect_any_instance_of(Widget),那么它意味着您不会对依赖项进行存根/模拟,而是允许来自单元外部的代码作为测试的一部分执行,这在某种程度上违背了目的单元测试。对于更高覆盖率的测试,即接受/集成,那么你不应该设置对象的期望,而应该通过检查网页上的输出或确认数据已保存来确认系统已经完成了您的请求。到磁盘。