0

这两个示例都将转到 STDOUT,但 cucumber 只看到第一个。第二种情况失败:

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
4

1 回答 1

0

我对 Aruba 不是很熟悉,但是快速查看它的源代码表明它针对 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
于 2012-08-01T06:18:09.493 回答