首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用RSpec should_receive忽略额外的消息?

如何用RSpec should_receive忽略额外的消息?
EN

Stack Overflow用户
提问于 2013-12-10 18:17:27
回答 2查看 3.5K关注 0票数 12

规格:

代码语言:javascript
复制
before do
  Logger.should_receive( :write ).with 'Log message 1'    
end

it 'works' do
  get '/'
end

Sinatra应用程序:

代码语言:javascript
复制
get '/'
  Logger.write( 'Log message 1' )
  Logger.write( 'Log message 2' )
end

此规范由于“日志消息2”而失败。如何告诉RSpec忽略任何其他消息,并且只测试预期的消息?

EN

回答 2

Stack Overflow用户

发布于 2013-12-10 18:23:46

您需要在消息期望之前对接收消息的方法进行存根。

代码语言:javascript
复制
# RSpec < 3
Logger.stub(write: nil)

method is deprecated in RSpec 3,而是使用以下内容之一

代码语言:javascript
复制
# RSpec >= 3
allow(Logger).to receive(:write).and_return(nil)  # Most appropriate in this case
allow(Logger).to receive(:write) { nil }  # Prefer block when returning something of a dynamic nature, e.g. a calculation
allow(Logger).to receive_messages(write: nil)  # Prefer hash when stubbing multiple methods at once, e.g. receive_messages(info: nil, debug: nil)

方法存根是对对象(真或双测试)的指令,用于响应消息返回已知值。

在本例中,告诉Logger对象在接收到write消息时(第一次)返回值nil

所以您的before块应该如下所示

代码语言:javascript
复制
before do
  Logger.stub(write: nil)
  Logger.should_receive(:write).with('Log message 1')
end
票数 9
EN

Stack Overflow用户

发布于 2018-03-22 07:28:13

这个问题有点老,但在找到了我在这里的方法之后,我想我会在rspec-模仿v3的情况下回答它。

如果您关心对象接收到某条消息,而不是只接收消息,那么使用断言的对象会预先死掉,这样效果很好。

receive(:...)have_received(:...)的细微区别

为了跟进最初的问题,并假设它是用rspec-mocks v3重写的,我的解决方案是:

代码语言:javascript
复制
allow(Logger).to receive(:write)
get '/'
expect(Logger).to have_received(:write).with('Log message 1')

注意,重要的是将断言放在末尾,因为它在调用时检查存根状态,而不是按照惯例在完成时进行检查。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20502220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档