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