cra*_*ate 2 ruby rspec cucumber
我跟随RSpec书,我无法通过黄瓜测试通过某个地点.我甚至试过在书中的源代码上运行黄瓜,它仍然无法通过.我不确定我是否正在使用更新版本的黄瓜,但必须有办法让它通过!
当我到达程序应该开始一个新游戏时,我被告知有一个未定义的方法'puts'.为什么它未定义,我应该如何捕捉puts黄瓜中的程序?在RSpec中运行测试以确保游戏使消息正常工作,不确定如何使其通过黄瓜.
(黄瓜版本1.3.17,Ruby版本2.1.2)
基本上,我有这些功能:
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 guess:"
Run Code Online (Sandbox Code Playgroud)
和这些步骤定义:
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
Run Code Online (Sandbox Code Playgroud)
这个红宝石代码:
module Codebreaker
class Game
def initialize(output)
@output = output
end
def start
@output.puts 'Welcome to Codebreaker!'
end
end
end
Run Code Online (Sandbox Code Playgroud)
我一直收到这个错误:
When I start a new game # features/step_definitions/codebreaker_steps.rb:16
private method `puts' called for #<RSpec::Matchers::BuiltIn::Output:0x007fa4ea200ad0> (NoMethodError)
./lib/codebreaker/game.rb:10:in `start'
./features/step_definitions/codebreaker_steps.rb:18:in `/^I start a new game$/'
features/codebreaker_starts_game.feature:7:in `When I start a new game'
Run Code Online (Sandbox Code Playgroud)
我如何解决这个问题,以便它通过黄瓜?
自从这个RSpec Book发布以来,有很多东西已经发生了变化,但我通过用以下代码替换你的code_break_steps.rb文件来实现它:
Given /^I am not yet playing$/ do
end
When /^I start a new game$/ do
@messenger = StringIO.new
game = Codebreaker::Game.new(@messenger)
game.start
end
Then /^I should see "([^"]*)"$/ do |message|
expect(@messenger.string.split("\n")).to include(message)
end
Run Code Online (Sandbox Code Playgroud)
RSpec 3有一个你试图覆盖的类被调用Output,这引起了太多的混乱.我只是简化了这一点,所以你们的测试仍然是相互交谈的stdout.
您可以should在最后一行使用相同的语法,但很快就会弃用它,以便更好地习惯expect我使用的语法.现在,如果这更令人困惑,你仍然可以使用:
@messenger.string.split("\n").should include(message)
| 归档时间: |
|
| 查看次数: |
1138 次 |
| 最近记录: |