在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

在使用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
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方法的调用。