我在Ruby 1.8.7中使用Cucumber和Aruba在Windows上运行应该是基本的BDD演示。我们的想法是让一个简单的“欢迎”应用程序提示用户输入名称,然后按名称向他们打招呼。
黄瓜情景如下:
# name_prompt.feature
Feature: Name prompt
In order to interact with the bot
As a friendly user
I want to tell the app my name
Scenario: Be asked
Given the application is running
Then I should see "What is your name?"
Scenario: Talk back
Given the application is running
And I type "Tim" and press Enter
Then I should see "Hello, Tim"
我的步骤实现使用一些Aruba提供的函数,看起来像:
# cli_steps.rb
Given /^the application is running$/ do
run_interactive(unescape("ruby chatbot.rb"))
end
Then /^I should see "([^"]*)"$/ do |arg1|
assert_partial_output(arg1)
end
Given /^I type "([^"]*)" and press Enter$/ do |arg1|
type(arg1)
end
机器人本身很简单,看起来像:
# chatbot.rb
$stdout.sync = true
puts "What is your name?"
name = gets.chomp
puts "Hello, #{name}"
在Mac / Linux上,这样可以正常工作并传递所有场景。但是,在Windows上,我一直看到在assert_partial_output
中测试的输出不包括最后一行(“Hello,Tim”)。
我尝试在pp
的内容上使用@interactive.stdout
,该内容应该包含程序的整个输出,但它只包含第一个“你的名字是什么?”线,加上换行符。
Windows上是否存在任何会导致Cucumber和Aruba出现此类问题的问题?为什么这些测试不会通过?
答案 0 :(得分:2)
似乎存在时间/缓冲问题。
我已经尝试过ChildProcess(Aruba在后台使用的库),与Aruba所做的唯一区别是在stdin上调用close
。以下脚本适用于chartbot.rb,即使没有stdout flush:
require "rubygems" unless defined?(Gem)
require "childprocess"
require "tempfile"
out = Tempfile.new "out"
process = ChildProcess.build("ruby", "chatbot.rb")
process.io.stdout = out
process.io.stderr = out
process.duplex = true
process.start
process.io.stdin.puts "Tim"
process.io.stdin.close
process.poll_for_exit 1
out.rewind
puts out.read
也许您可以将此问题报告给Aruba错误跟踪器?