以下是根据RSpec book中的示例传递代码。
在describe "#start"
区块中,为什么should_receive...'Welcome to Codebreaker!
出现在game.start
之前?
在我看来,在调用start方法之前不会放置文本。但是,如果我重新排序这两行,则测试不再通过。
为什么会这样?
LIB / codebreaker.rb
module Codebreaker
class Game
def initialize(output)
@output = output
end
def start
@output.puts "Welcome to Codebreaker!"
end
end
end
规格/ codebreaker_spec.rb
require 'codebreaker'
module Codebreaker
describe Game do
let(:output) { double('output') }
let(:game) { Game.new(output) }
describe "#start" do
it "sends a welcome message" do
output.should_receive(:puts).with('Welcome to Codebreaker!')
game.start
end
end
end
end
答案 0 :(得分:2)
来自官方文档:https://www.relishapp.com/rspec/rspec-mocks/v/2-5/docs/message-expectations/expect-a-message
“使用should_receive()设置接收者应该之前 完成 之前收到消息的期望。”
阅读上面两个粗体字,您可能对此方法有了更好的理解。设置should_receive()
时,它会建立一个期望值,并会在此示例中观察下面运行的代码(阻止)
因此,只有在之前设置并稍后运行代码时,此方法才有意义。这应该可以解释你的问题。
答案 1 :(得分:1)
在这个块中
it "sends a welcome message" do
output.should_receive(:puts).with('Welcome to Codebreaker!')
game.start
end
预计输出接收'欢迎使用Codebreaker!'好?因此,在创建期望之后,代码运行并且测试通过。
如果你改变了行的顺序,你将运行代码,然后你创建一个不会发生的期望,因为输出永远不会收到“puts”,测试将失败。
使用rspec,你应该始终按照这个顺序创建一个期望并实现它