我正在阅读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!”当我明确告诉它只想要“输入一个猜测:”时,“输入一个猜测”,如何在保持同样的设置/结构的同时解决这个问题?
答案 0 :(得分:0)
第二种情况失败了,因为你的期望值很高。您的意思是Enter a guess:
而不是Enter guess:
。
答案 1 :(得分:0)
不幸的是,rspec对字符串的措辞非常挑剔。在您的启动方法中,您编写了"Enter guess"
而不是"Enter a guess:"
。
遵循对T的措辞非常重要,当您开始raise
错误时,rspec会给您一个非常讨厌的回复。