2012-05-29 3 views
0

The RSpec Book으로 Rspec + 오이를 배우고 있습니다. 나는 처음에는 코드 브레이커 게임을 개발하는 중이다.오이 테스트 두배 : 시나리오가 실패하지만 단계가 전달됩니다

여기에는 쉘에서 명령을 입력하고 "Welcome to Codebreaker!"라는 두 가지 응답을받는 사용자를 나타내는 "Codebreaker started game"기능이 있습니다. 및 "추측을 입력하십시오 :". 출력은 cucumber 스크립트가 사용

Feature: code-breaker starts game 
    As a code-breaker 
    I want to start a game 
    So that I can break the code 

    Scenario: start game 
     Given I am not yet playing 
     When I start a new game 
     Then I should see "Welcome to Codebreaker!" 
     And I should see "Enter a guess:" 

으로,이 책은 Welcome to Codebreaker!Enter a guess: 인수와 함께 puts 메시지가 나타날 것으로 예상되는 모의 객체 output를 만드는 : 여기처럼 기능이 모습입니다. 다음은 단계 정의에서 보는 방법입니다.

#the mock object 
class Output 
    def messages 
     @messages ||= [] 
    end 

    def puts(message) 
     messages << message 
    end 
end 

def output 
    @output ||= Output.new 
end 

Given /^I am not yet playing$/ do 
end 

When /^I start a new game$/ do 
    game = Codebreaker::Game.new(output) 
    game.start 
end 

Then /^I should see "([^"]*)"$/ do |message| 
    output.messages.should include(message) 
end 

좋아, 지금까지 아무 문제 없습니다.

이 운동을하면서, 나는 rspeck double framework가 오이 안에서 사용될 수 있다는 것을 기억하고 있었기 때문에 나는 그것을 약간 닦을 수있을 것이라고 생각했습니다.

require 'cucumber/rspec/doubles' 

을 그리고 나는 단계 정의 변경 : 제가 포함했다

먼저 rspeck support/env.rb에 프레임 워크를 두 배로

Given /^I am not yet playing$/ do 
end 

When /^I start a new game$/ do 
    @output = double('output').as_null_object #the mock object 
    game = Codebreaker::Game.new(@output) 
    game.start 
end 

Then /^I should see "([^"]*)"$/ do |message| 
    @output.should_receive(:puts).with(message) 
end 

이상한 생각이 지금, 나는이 기능을 실행할 것을을 오이, 요약에서 나는 모든 4 단계를 통과하지만 전체 시나리오는 얻지 못한다. 그게 어떻게 가능해? 무슨 일입니까? 여기 내가 명령 줄에서 얻을 출력 : 당신이 should_receive 같은 기대를 설정하면

Feature: code-breaker starts game 
    As a code-breaker 
    I want to start a game 
    So that I can break the code 

    Scenario: start game       # features/codebreaker_starts_game.feature:6 
    Given I am not yet playing     # features/step_definitions/codebreaker_steps.rb:1 
    When I start a new game      # features/step_definitions/codebreaker_steps.rb:4 
    Then I should see "Welcome to Codebreaker!" # features/step_definitions/codebreaker_steps.rb:10 
    And I should see "Enter a guess:"   # features/step_definitions/codebreaker_steps.rb:10 
     (Double "output").puts("Welcome to Codebreaker!") 
      expected: 1 time 
      received: 0 times (RSpec::Mocks::MockExpectationError) 
     /home/a_user/www/codebreaker/features/step_definitions/codebreaker_steps.rb:11:in `block in <top (required)>' 
     /var/lib/gems/1.9.1/gems/rspec-mocks-2.10.1/lib/rspec/mocks/error_generator.rb:80:in `__raise' 
     /var/lib/gems/1.9.1/gems/rspec-mocks-2.10.1/lib/rspec/mocks/error_generator.rb:39:in `raise_expectation_error' 
     /var/lib/gems/1.9.1/gems/rspec-mocks-2.10.1/lib/rspec/mocks/message_expectation.rb:251:in `generate_error' 
     /var/lib/gems/1.9.1/gems/rspec-mocks-2.10.1/lib/rspec/mocks/message_expectation.rb:207:in `verify_messages_received' 
     /var/lib/gems/1.9.1/gems/rspec-mocks-2.10.1/lib/rspec/mocks/method_double.rb:117:in `block in verify' 
     /var/lib/gems/1.9.1/gems/rspec-mocks-2.10.1/lib/rspec/mocks/method_double.rb:117:in `each' 
     /var/lib/gems/1.9.1/gems/rspec-mocks-2.10.1/lib/rspec/mocks/method_double.rb:117:in `verify' 
     /var/lib/gems/1.9.1/gems/rspec-mocks-2.10.1/lib/rspec/mocks/proxy.rb:88:in `block in verify' 
     /var/lib/gems/1.9.1/gems/rspec-mocks-2.10.1/lib/rspec/mocks/proxy.rb:88:in `each' 
     /var/lib/gems/1.9.1/gems/rspec-mocks-2.10.1/lib/rspec/mocks/proxy.rb:88:in `verify' 
     /var/lib/gems/1.9.1/gems/rspec-mocks-2.10.1/lib/rspec/mocks/methods.rb:116:in `rspec_verify' 
     /var/lib/gems/1.9.1/gems/rspec-mocks-2.10.1/lib/rspec/mocks/space.rb:11:in `block in verify_all' 
     /var/lib/gems/1.9.1/gems/rspec-mocks-2.10.1/lib/rspec/mocks/space.rb:10:in `each' 
     /var/lib/gems/1.9.1/gems/rspec-mocks-2.10.1/lib/rspec/mocks/space.rb:10:in `verify_all' 
     /var/lib/gems/1.9.1/gems/rspec-mocks-2.10.1/lib/rspec/mocks.rb:19:in `verify' 
     /var/lib/gems/1.9.1/gems/cucumber-1.1.9/lib/cucumber/rspec/doubles.rb:12:in `After' 

Failing Scenarios: 
cucumber features/codebreaker_starts_game.feature:6 # Scenario: start game 

1 scenario (1 failed) 
4 steps (4 passed) 
0m0.009s 

답변

1

, 당신은 미래의 어떤 시점 지정된 메소드가 호출되어야 함을 지정하고이 - 이전에 일어난 아무것도 무시됩니다 (그렇지 않으면 과거 시제에 have_received 또는 이와 비슷한 것이 있어야합니다).

코드에서 Then 단계에서 기대치를 설정 중이지만 When 단계 (예전)에서 메소드가 호출되므로 그 시점에서 아무런 기대치가 설정되지 않았습니다. 당신의 double은 어떤 메소드도 호출 할 수 있도록 설정되어 있으므로 오류는 발생하지 않습니다.하지만 스펙이 끝날 때 모든 기대가 충족되었는지 여부를 확인하면 no라고 말하고 예외를 발생시킵니다.

+0

Ok! 감사합니다. @FrederickCheung. 어쩌면 이것이 오이에서 조롱이 낙담하는 이유 중 하나입니다. 왜냐하면 그 사건은 기대와 분리되어 선언되어야하기 때문입니다. 분명히 책에서 한 것처럼 (나는 상태를 검사하고 행동이 아니기 때문에) 나는 대신 스텁해야합니다. 제발, 만약 내가이 논리에 잘못이 있다면, 저에게이 모든 것을 담은 초보자입니다. :) –

관련 문제