0

どちらの例もSTDOUTに送られますが、キュウリは最初の例しか見ません。2番目のシナリオは次の場合に失敗します。

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に書き込まれたすべてのコンテンツには適用されないことがわかります。2番目のシナリオで自分で呼び出すコードは、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 に答える