在RSpec中,是否有一种方法等同于;联合国秘书处;但对于;“你应该收到”吗;?
在使用RSpec时,是否有任何方法可以消除任何存根和模仿 例如:在RSpec中,是否有一种方法等同于;联合国秘书处;但对于;“你应该收到”吗;?,rspec,mocking,stub,Rspec,Mocking,Stub,在使用RSpec时,是否有任何方法可以消除任何存根和模仿 例如: RestClient.should_receive(:delete).with("http://www.example.com") ... ... # this will remove the mocking of "should_receive" and # restore the proper "delete" method on "RestClient". RestClient.mocking_reset (mock
RestClient.should_receive(:delete).with("http://www.example.com")
...
...
# this will remove the mocking of "should_receive" and
# restore the proper "delete" method on "RestClient".
RestClient.mocking_reset
(mocking_reset
是我对所需功能的虚构名称)
我知道有一种方法“unsub”可以重置“stub”,但不重置“should_receive”
那么,除了“应该接收”之外,还有什么方法与“unsub”等效吗
Panayotis目前(rspec mocks 2.10.1)没有一种方法等效于取消订阅
,但是对于应该接收
。您可以使用rspec_reset
重置所有存根和模拟,还可以编写肮脏的hack来删除特定的期望(我不建议这样做)
以下是删除对象上的所有存根和期望的示例:
描述“使用rspec_reset重置存根和期望值”do
在做之前
@person=mock(‘person’)
@应接收的人员(:戳)
结束
“当我们重置所有存根和期望时,它不应该失败”
@person.rspec_重置
结束
结束
请注意,此方法在rspec源代码中被注释为@private
,这意味着您应该避免过度使用它,并且它可能会在未来版本的rspec中中断而不发出警告。然而,它在rspec本身的规范中使用得相当广泛,因此它不太可能很快被弃用
在深入研究rspec mocks代码之后,您当然可以做一些非常糟糕的事情,自己撕掉一个特定的期望:
#适用于rspec 2.10.1
描述“用一个丑陋的黑客去除一个期望”是什么
在做之前
@person=mock(‘person’)
@应接收的人员(:戳)
结束
它“不应该因为违反了好编程的每一条法律而在我们破解rspec之后失败”,永远“做吧”
@person.instance\u variable\u get(:@mock\u proxy)。instance\u variable\u get(:@method\u double)[:poke]。清除
结束
结束
这是非常糟糕的,因为它违反了rspec测试包的封装,您不应该这样做。相反,如果您确实有令人信服的理由删除特定的期望,那么正确的做法是在rspec mock的上游添加一个公共方法,该方法向unsub
添加一个并行方法,但用于删除特定的期望。它可能位于此处(请注意stub
和unsub
的定义也在此文件中):
在使用上述任何建议来消除预期之前,你可能想考虑一下你的规格是否真的需要这么做或者是否应该重构。使用should\u receive
是对代码的断言,通常您应该尝试创建只断言一件事的示例(即it
块)。我会很好奇为什么您需要像rspec_reset
这样的东西,除非您在全局设置中尝试做得太多(例如before:each
或before:all block),或者您的示例尝试做得太多(即在一个示例中使用多个断言)
当然,rspec mock的测试套件中可能存在一个例外,其中rspec_reset
用于在测试应用存根和mock功能的示例之间重置状态。除非您这样做,否则您的测试可能会得到改进,不再依赖对象上存根和模拟的全局重置
我希望这会有所帮助,如果您认为在
unsub
中添加等效方法是合理的,但对于消息期望(即,在使用后,您应该收到
)。如果我确信这是一个好的事情,我会考虑添加这个方法并建议它被添加到上游。也许它会被称为unset\u expectation
?另外,请随意使用上述代码和内部结构中的指南,自行创建rspec模拟的拉取请求,我们将查看是否接受创建相当于unsub
的模拟,对于rspec>=2.14,接受的答案将不再有效
我建议您参考Bernhard Köhler关于此线程的回答(复制如下以防止链接腐烂):
RSpec 2.14中不存在重置方法。相反,它是一个助手
在用于rspec模拟的spec_helper.rb文件中定义的方法
项目
您可以取消发布expect
/allow
调用,方法是:
RSpec::Mocks.proxy_for(object).reset
对于RSpec 3.9.0,我发现至少上述内容已被替换为:
RSpec::Mocks.space.proxy_for(object).reset
您可以通过以下方式覆盖以前的一些模拟:
expect(RestClient).to receive(:delete).and_call_original
或者,如果它不是任何类型的期望,只是一个简单的存根:
allow(RestClient).to receive(:delete).and_call_original
请记住,还有
expect\u any\u instance\u of
和allow\u any\u instance\u of
非常感谢您的回答。我之所以需要此功能,是因为我在“after:each”之后执行了一个“clean\u test\u data”方法。这需要使用真实的方法。在将我的问题发布到软件上之后,我意识到我仍然可以使用“干净的测试数据”,但可以使用“之前:每个”,这就是我问题的解决方案。这样,我最终就不需要任何解绑或脱绑了。同时,既然我在过去找到了使用“unsub”的好理由,那么出于完整性的原因,我不明白为什么不使用相同的“unset_expection”,然后让模拟用户决定。你不能编辑少于6个字符,这太可笑了!上面的方法名是mocking\u resest
,应该是mocking\u reset
。添加编辑消息,编辑将超过6个字符:)这并不等同于unsub
,因为它会继续观察对mocked方法的调用。