我正在ruby 1.8.7中的windows上运行cucumber和aruba,这应该是一个基本的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"
我的step实现使用了一些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,t i m”)。我试过在
pp
的内容上使用@interactive.stdout
,它应该包含程序的整个输出,但它只包含第一个“您的名字是什么?”行,加上换行符。窗户上有没有什么问题会引起黄瓜和阿鲁巴的这种麻烦?为什么这些考试不及格?
最佳答案
似乎存在时间/缓冲问题。
我试过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
也许你可以把这个问题报告给阿鲁巴虫追踪者?
https://github.com/cucumber/aruba/issues
关于ruby - cucumber + Aruba + Windows:测试没有看到stdout的最后一行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5823907/