2013-07-05 5 views
0

에 통과하지, 나는 다음과 같은 테스트 코드를 가지고 :as_null_object 내가 RSpec에 책을 통해 일하고 있어요 두 개의 입력

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 

나 '때문에 다음 코드에 대응

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 

ve set : double.as_null_object로 출력하고, 예상하지 못한 인수/메소드를 무시할 것으로 기대합니다. 첫 번째 테스트 (환영 메시지 보내기)의 경우, 그것이 수행하는 작업이며 통과합니다. 두 번째 테스트, 그러나 나에게이 오류주고있다 : "에 오신 것을 환영합니다 Codebreaker에"

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>' 

왜 모두 반환하는 두 배를 그리고 "추측을 입력하십시오"라고 명시 적으로 말했을 때 "추측을 입력하십시오"라고하고,이 동일한 설정/구조를 유지하면서 어떻게 수정할 수 있습니까?

답변

0

오타가 예상되어 두 번째 사례가 실패했습니다. Enter guess: 대신 Enter a guess:을 의미했습니다.

0

불행히도 rspec은 문자열의 문언에 대해 매우 까다 롭습니다. 시작 메소드에서 "Enter a guess:" 대신 "Enter guess"을 작성했습니다.

T를 사용하는 것이 중요합니다. raise 오류가 발생하기 시작하면 rspec이 매우 불쾌한 반응을 보입니다.

행운을 빈다. Rspec은 여러분이 더 깊이 들어설수록 훌륭한 도구입니다.

관련 문제