as_null_object没有传递两个输入

时间:2013-07-05 16:14:59

标签: ruby rspec

我正在阅读RSpec Book,我有以下测试代码:

require 'spec_helper'

module Codebreaker
  describe Game do
    describe "#start" do

      let(:output) { double('output').as_null_object }
      let(:game) { Game.new(output) }

      it "sends a welcome message" do
        output.should_receive(:puts).with('Welcome to Codebreaker!')
        game.start
      end

      it "prompts for the first guess" do
        output.should_receive(:puts).with('Enter guess:')
        game.start
      end
    end
  end
end

对应于以下代码:

module Codebreaker
  class Game
    def initialize(output)
      @output = output
    end

    def start
      @output.puts 'Welcome to Codebreaker!'
      @output.puts 'Enter a guess:'
    end
  end
end

因为我已经设置:输出为double.as_null_object,我希望它忽略它不期望的任何参数/方法。对于第一次测试(发送欢迎消息),这就是它的作用,并且它通过了。然而,第二个测试是给我这个错误:

Failure/Error: output.should_receive(:puts).with('Enter guess:')
   Double "output" received :puts with unexpected arguments
     expected: ("Enter guess:")
          got: ("Welcome to Codebreaker!"), ("Enter a guess:")
 # ./spec/codebreaker/game_spec.rb:16:in `block (3 levels) in <module:Codebreaker>'

为什么双重返回“欢迎使用Codebreaker!”当我明确告诉它只想要“输入一个猜测:”时,“输入一个猜测”,如何在保持同样的设置/结构的同时解决这个问题?

2 个答案:

答案 0 :(得分:0)

第二种情况失败了,因为你的期望值很高。您的意思是Enter a guess:而不是Enter guess:

答案 1 :(得分:0)

不幸的是,rspec对字符串的措辞非常挑剔。在您的启动方法中,您编写了"Enter guess"而不是"Enter a guess:"

遵循对T的措辞非常重要,当您开始raise错误时,rspec会给您一个非常讨厌的回复。

祝你好运!随着您的进一步深入,Rspec是一个很好的工具。