Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Rspec双重泄漏到另一个示例_Ruby_Rspec - Fatal编程技术网

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
命令使这些变量在功能上等同于所描述对象范围内的实例变量,因此您并不是在每个示例中真正测试新创建的对象

一些备选方案包括:

  • 重构以将所有设置放置在(:each)之前的
    中,而不使用let语句
  • 通过在每个示例中进行更多设置,使您的测试受潮
  • 为一个新的#descripe设置新的作用域,这样您的测试双精度/值就不会被重用
  • 如果需要,使用:before、:after或:around块重置测试之间的状态

  • 由于您没有显示测试中的实际类或实际代码,因此很难提供关于测试要测试的对象的正确方法的具体见解。甚至不清楚为什么您觉得需要在单元测试中测试collaborator对象,所以您可能也想考虑一下。

    事实证明,我使用的是单例作为客户端,以前没有实现过,所以通过示例对其进行真正的类缓存。为了修复它,我所做的只是模拟
    实例化
    方法,而不是
    新的
    方法,一切都正常

    因此,这最终奏效了:

    allow(Client::Base).接收(:实例化)和返回(Client\u double)
    
    感谢Todd给出了非常好的答案,但事实证明,这是因为客户是单身汉,我还没有注意到。。因此,我没有模仿:new方法,而是模仿了:instance方法,一切都正常。