为什么带有aruba的黄瓜看不到我程序的输出?

时间:2012-07-31 18:52:57

标签: ruby cucumber aruba

两个例子都是STDOUT,但黄瓜只能看到第一个。第二种情况失败了:

Then the stdout should contain "test"  # aruba-0.4.11/lib/aruba/cucumber.rb:82
  expected "" to include "test" (RSpec::Expectations::ExpectationNotMetError)
  features/test.feature:13:in `Then the output should contain "test"'

功能:

Scenario: echo test
  Given a blank slate
  When I run `echo "test"`
  The stdout should contain "test"

Scenario: puts test
  Given a blank slate
  When I start the program
  The stdout should contain "test"

步骤定义:

When /^I start the program$/ do
  TestModule::Main.new.start
end

代码:

module TestModule
  class Main
    def initialize
    end
    def start
      $stdout.puts "test"
    end
  end
end

1 个答案:

答案 0 :(得分:0)

我对Aruba并不熟悉,但快速查看它source code表示它对STDOUT(或任何输出)的断言适用于它启动的进程本身,并不是所有写入STDOUT的内容。在第二种情况下,您自己调用的代码超出了Aruba的控制范围,因此不会跟踪它的输出。

如果你考虑一下,它可能无法以任何其他方式工作 - 如果Aruba捕获所有STDOUT断言,那么它将包含Cucumber自己的测试输出......

看起来你正在尝试在进程中测试程序而不使用Aruba来调用单独的Ruby进程。如果是这种情况,我建议修改程序,以便可以传递STDOUT替换,例如

def initialize(output=$stdout)

然后当你启动代码时:

When /^I start the program$/ do
    TestModule::Main.new(@output).start
end

你可以改变你的断言:

Then the stdout should contain "(.+)" do |string|
    @output.should include string
end