黄瓜测试加倍:场景失败但其步骤通过

时间:2012-05-29 08:47:11

标签: ruby rspec mocking cucumber bdd

我正在用The RSpec Book学习Rspec + Cucumber。我刚开始时正在开发Codebreaker游戏。

在其中,有一个功能“Codebreaker启动游戏”,它只代表用户在shell中键入命令并获得两个响应:“欢迎使用Codebreaker!”和“输入一个猜测:”。这就是该功能的外观:

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:"

由于cucumber脚本使用了输出,本书正在创建一个模拟对象output,它希望收到puts消息Welcome to Codebreaker!和{{} 1}}参数。这是它在步骤定义中的外观:

Enter a guess:

好的,到现在为止没问题。

做这个练习,我记得之前已经阅读过rspeck双打框架可以在黄瓜里面使用,所以我想我可以稍微清理一下。

首先,我在#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双打框架:

support/env.rb

然后我更改了步骤定义:

require 'cucumber/rspec/doubles'

奇怪的是,现在,当我用黄瓜执行该功能时,在摘要中我得到了所有4个步骤但不是整个场景。这怎么可能?它发生了什么?这是我从命令行得到的输出:

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

1 个答案:

答案 0 :(得分:1)

当您设置should_receive之类的期望时,您指定将来应该调用指定方法的某个点 - 忽略之前发生的任何事情(否则它应该是has_received或者某些东西像过去时一样。)

在您的代码中,您在Then步骤中设置了期望值,但该方法会在When步骤(即之前)中调用,因此此时未设置任何期望值。你的double被设置为允许调用任何方法,所以你没有得到任何错误,但是当spec检查结束时是否满足所有期望时它会说no并引发异常