我正在用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
答案 0 :(得分:1)
当您设置should_receive
之类的期望时,您指定将来应该调用指定方法的某个点 - 忽略之前发生的任何事情(否则它应该是has_received或者某些东西像过去时一样。)
在您的代码中,您在Then
步骤中设置了期望值,但该方法会在When
步骤(即之前)中调用,因此此时未设置任何期望值。你的double被设置为允许调用任何方法,所以你没有得到任何错误,但是当spec检查结束时是否满足所有期望时它会说no并引发异常