黄瓜+阿鲁巴+ Windows:测试看不到最后一行标准输出?

时间:2011-04-28 19:28:23

标签: ruby cucumber bdd aruba

我在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出现此类问题的问题?为什么这些测试不会通过?

1 个答案:

答案 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错误跟踪器?

https://github.com/cucumber/aruba/issues