2

我在 Ruby 1.8.7 的 Windows 上使用 Cucumber 和 Aruba 运行应该是基本的 BDD 演示。这个想法是让一个简单的“问候”应用程序提示用户输入名称,然后按名称向他们问好。

Cucumber 场景如下所示:


# 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 出现这种问题?为什么这些测试不通过?

4

1 回答 1

2

似乎存在时间/缓冲区问题。

我已经尝试过 ChildProcess(Aruba 在后台使用的库),与 Aruba 所做的唯一区别是在标准输入上调用close。以下脚本适用于 chartbot.rb,即使没有标准输出刷新:

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

也许您可以将此问题报告给 Ar​​uba 错误跟踪器?

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

于 2011-04-28T23:29:14.317 回答