Ruby Rspec双重泄漏到另一个示例
我正在测试一个类,该类使用一个发出外部请求的客户机,我想模拟这个客户机,但是验证它是否被调用,但是我得到了一个双重错误 我的测试看起来像这样:Ruby Rspec双重泄漏到另一个示例,ruby,rspec,Ruby,Rspec,我正在测试一个类,该类使用一个发出外部请求的客户机,我想模拟这个客户机,但是验证它是否被调用,但是我得到了一个双重错误 我的测试看起来像这样: 描述“#执行”do let(:attributes){{foo:'bar'} let(:client_double){double('client',create:nil)} let(:use_case){descripted.class.new} 在做之前 允许(Client::Base).接收(:new).和返回(Client\u double) 用
描述“#执行”do
let(:attributes){{foo:'bar'}
let(:client_double){double('client',create:nil)}
let(:use_case){descripted.class.new}
在做之前
允许(Client::Base).接收(:new).和返回(Client\u double)
用例执行(属性)
结束
它“创造”了一些东西
期望(某物。通过(foo:'bar')找到你。不是零
结束
它“调用客户机”do
期望(客户端).接收带有('bar')的_(:create)
结束
结束
第一个示例按预期通过,但是第二个示例中rspec不断中断,这给了我一个错误:
#<Double "foo"> was originally created in one example but has leaked into another example and can no longer be used. rspec-mocks' doubles are designed to only last for one example, and you need to create a new one in each example you wish to use it for.
#最初是在一个示例中创建的,但已泄漏到另一个示例中,无法再使用。rspec mocks的Double设计为仅适用于一个示例,您需要在每个希望使用它的示例中创建一个新的。
有人知道我能做些什么来修复它吗?使用Let方法重用设备
在本例中,before
实际上是before(:each)
,这是在重用您用#let helper方法定义的客户端和属性。let
命令使这些变量在功能上等同于所描述对象范围内的实例变量,因此您并不是在每个示例中真正测试新创建的对象
一些备选方案包括:
中,而不使用let语句
由于您没有显示测试中的实际类或实际代码,因此很难提供关于测试要测试的对象的正确方法的具体见解。甚至不清楚为什么您觉得需要在单元测试中测试collaborator对象,所以您可能也想考虑一下。事实证明,我使用的是单例作为客户端,以前没有实现过,所以通过示例对其进行真正的类缓存。为了修复它,我所做的只是模拟
实例化
方法,而不是新的
方法,一切都正常
因此,这最终奏效了:
allow(Client::Base).接收(:实例化)和返回(Client\u double)
感谢Todd给出了非常好的答案,但事实证明,这是因为客户是单身汉,我还没有注意到。。因此,我没有模仿:new方法,而是模仿了:instance方法,一切都正常。