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

B S*_*ven 10 ruby rspec expectations sinatra

规格:

before do
  Logger.should_receive( :write ).with 'Log message 1'    
end

it 'works' do
  get '/'
end
Run Code Online (Sandbox Code Playgroud)

Sinatra App:

get '/'
  Logger.write( 'Log message 1' )
  Logger.write( 'Log message 2' )
end
Run Code Online (Sandbox Code Playgroud)

由于"Log message 2",此规范失败.如何告诉RSpec忽略任何其他消息,并只测试预期的消息?

Ash*_*son 7

您需要在消息预期之前存根将接收消息的方法.

# RSpec < 3
Logger.stub(write: nil)
Run Code Online (Sandbox Code Playgroud)

stub方法在RSpec 3中已弃用,而是使用以下之一

# 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)
Run Code Online (Sandbox Code Playgroud)

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

在这种情况下,告诉Logger对象nil在收到write消息时返回值(第一次).

所以你的before块应该是这样的

before do
  Logger.stub(write: nil)
  Logger.should_receive(:write).with('Log message 1')
end
Run Code Online (Sandbox Code Playgroud)