RSpec描述:为什么`should`应该在应该导致它的方法之前?

时间:2013-05-02 01:51:41

标签: ruby-on-rails ruby rspec

以下是根据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

2 个答案:

答案 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,你应该始终按照这个顺序创建一个期望并实现它