Огурец + Аруба + Windows: тесты не видят последнюю строку стандартного выхода? - PullRequest
2 голосов
/ 28 апреля 2011

Я запускаю то, что должно быть основной демонстрацией BDD с использованием Cucumber и Aruba на Windows в Ruby 1.8.7. Идея состоит в том, чтобы простое приложение-приветствие запросило у пользователя имя, а затем передало ему привет по имени.

Сценарии с огурцом выглядят так:


# 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, не включает последнюю строку («Привет, Тим»).

Я пытался использовать pp для содержимого @interactive.stdout, которое должно содержать весь вывод программы, но оно просто содержит первый "Как тебя зовут?" строка плюс разрыв строки.

Есть ли какие-либо проблемы в Windows, которые могли бы вызвать такие проблемы с Cucumber и Aruba? Почему эти тесты не пройдут?

1 Ответ

2 голосов
/ 29 апреля 2011

Кажется, есть проблема с синхронизацией / буфером.

Я пробовал ChildProcess (библиотека, которую Аруба использует в фоновом режиме), и единственное отличие от того, что делает Аруба, это вызов close на стандартный ввод. Следующий скрипт работает с chartbot.rb даже без очистки stdout:

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

...