我正在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/

10-15 20:33