所以我在“Pragmatic Cucumber”中的第一个项目,我在步骤定义中得到一个未定义的方法错误。错误来自$?成功?不用说我很困惑。我错过了什么宝石?
这是步骤定义
Given /^the input "(.*?)"$/ do |input|
@input = input
end
When /^the calculator is run$/ do
@output = 'ruby calc.rb #{@input}'
raise('Command failed!') unless $?.success? #$?.success? is failing. look that up.
end
Then /^the output should be "(.*?)"$/ do |arg1|
pending # express the regexp above with the code you wish you had
end
这是错误。
Feature: Adding
Scenario: Add two numbers # features/adding.feature:3
Given the input "2+2" # features/step_definitions/calculator_steps.rb:1
When the calculator is run # features/step_definitions/calculator_steps.rb:5
undefined method `success?' for nil:NilClass (NoMethodError)
./features/step_definitions/calculator_steps.rb:7:in `/^the calculator is run$/'
features/adding.feature:5:in `When the calculator is run'
Then the output should be "4" # features/step_definitions/calculator_steps.rb:10
Failing Scenarios:
cucumber features/adding.feature:3 # Scenario: Add two numbers
1 scenario (1 failed)
3 steps (1 failed, 1 skipped, 1 passed)
0m0.012s
那么,这里的问题是什么?我知道.success?是对的,为什么不是$?注册?谢谢!
答案 0 :(得分:10)
您需要使用反引号而不是引号来运行命令:
@output = 'ruby calc.rb #{@input}'
应该是:
@output = `ruby calc.rb #{@input}`
编辑:
刚试过这个 - 你想要非常小心地使用这个结构。在Cucumber场景之间不会清除$?
的值,因此很容易对先前场景中运行的命令的结果进行断言。您可能希望查看Aruba,它是专门为需要Cucumber执行或断言命令行程序的情况而设计的。
答案 1 :(得分:1)
代码ruby calc.rb #{@input}
是一个Shell命令 - 包括反引号中的命令是告诉Ruby你想要执行Shell命令的方法之一。 This link将为您提供有关在Ruby中运行Shell命令的其他方法的一些信息。
This discussion专门回答了你的问题,并且围绕这个话题进行了一些讨论,如果你想了解更多,这总是很好。如果您对黄瓜书有特别的疑问,并希望从马的口中得到答案,那么这个论坛可能是您最好的选择。