规格:
before do
Logger.should_receive( :write ).with 'Log message 1'
end
it 'works' do
get '/'
endSinatra应用程序:
get '/'
Logger.write( 'Log message 1' )
Logger.write( 'Log message 2' )
end此规范由于“日志消息2”而失败。如何告诉RSpec忽略任何其他消息,并且只测试预期的消息?
发布于 2013-12-10 18:23:46
您需要在消息期望之前对接收消息的方法进行存根。
# RSpec < 3
Logger.stub(write: nil)method is deprecated in 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)方法存根是对对象(真或双测试)的指令,用于响应消息返回已知值。
在本例中,告诉Logger对象在接收到write消息时(第一次)返回值nil。
所以您的before块应该如下所示
before do
Logger.stub(write: nil)
Logger.should_receive(:write).with('Log message 1')
end发布于 2018-03-22 07:28:13
这个问题有点老,但在找到了我在这里的方法之后,我想我会在rspec-模仿v3的情况下回答它。
如果您关心对象接收到某条消息,而不是只接收消息,那么使用断言的对象会预先死掉,这样效果很好。
receive(:...)和have_received(:...)的细微区别
为了跟进最初的问题,并假设它是用rspec-mocks v3重写的,我的解决方案是:
allow(Logger).to receive(:write)
get '/'
expect(Logger).to have_received(:write).with('Log message 1')注意,重要的是将断言放在末尾,因为它在调用时检查存根状态,而不是按照惯例在完成时进行检查。
https://stackoverflow.com/questions/20502220
复制相似问题