2

Aruba で標準入力への書き込みに問題があります。私は3つのアプローチを試みました。

アプローチ 1:

Scenario: Write to stdin take 1
  Given a file named "infile" with:
    """
    Hello World!
    """
  When I run `cat < infile`
  Then the output should contain exactly:
    """
    Hello World!
    """

このため、次のエラーが発生します。

  expected: "Hello World!"
       got: "Hello World!cat: <: No such file or directory\n" (using ==)
  Diff:
  @@ -1,2 +1,2 @@
  -Hello World!
  +Hello World!cat: <: No such file or directory
   (RSpec::Expectations::ExpectationNotMetError)
  features/cgi.feature:17:in `Then the output should contain exactly:'

Aruba は「<」を文字どおりに渡しますが、シェルはパイプを使っていくつかの魔法を行います。

アプローチ 2:

Scenario: Write to stdin take 2
  When I run `cat` interactively
  And I type "Hello World!"
  Then the output should contain:
    """
    Hello World!
    """

次のエラーが表示されます。

  process still alive after 3 seconds (ChildProcess::TimeoutError)
  features/cgi.feature:25:in `Then the output should contain:'

わかりませんが、猫はEOF文字を受け取っていないため、猫は開いたままになり、書き込み前にさらなる入力を待ちます。入力の終了を知らせる方法はありますか?

アプローチ 3:

Scenario: Write to stdin take 1
  Given a file named "infile" with:
    """
    Hello World!
    """
  When I run `sh -c "cat < infile"`
  Then the output should contain exactly:
    """
    Hello World!
    """

このアプローチは機能しますが、シェル プロセスを介して入力を渡すことは理想的なソリューションではないようです。

これはかなり標準的な要件であると予想していましたが、まだ機能させることに成功していません。

助言がありますか?

ありがとう。

4

2 に答える 2

3

編集:インタラクティブモードを使用してファイルをパイプしようとしましたが、実際の使用では、を使用するよりも大幅に遅いことがわかりましたsh -c "process < infile"。これがなぜなのかよくわかりません.Rubyの標準入力への書き込みで余分なオーバーヘッドが発生する@interactive.stdin.write(input)か、パイプを閉じるには少し時間がかかります@interactive.stdin.close()。結局sh -c、スローダウンを回避するために使用しました。クロスプラットフォームのサポートが必要な場合は、より遅いランタイムが許容される可能性があると思います.

元の投稿:

これを達成するためのいくつかの方法を見つけました。

テイク 1 の場合:

Scenario: Write to stdin take 1
  Given a file named "infile" with:
    """
    Hello World!
    """
 -When I run `cat < infile`
 +When I run `cat` interactively
 +And I pipe in the file "infile"
  Then the output should contain exactly:
    """
    Hello World!
    """

シナリオ 1 では、パイプ (<) での試行を削除し、代わりにプロセスを対話的に実行しました。バックエンドで、次のステップを書きました。

When /^I pipe in the file "(.*?)"$/ do |file|
  in_current_dir do
    File.open(file, 'r').each_line do |line|
      _write_interactive(line)
    end
  end
  @interactive.stdin.close()
end

@interactive.stdin.close() は関数として aruba/api.rb に移動する必要がありますが、アイデアは機能します。_write_interactive への呼び出しはおそらく type() への呼び出しでもあるはずですが、type() は常に新しい行を追加します。これは、ファイルをパイプするときに必要なものではない可能性があります。

テイク 2 の場合:

Scenario: Write to stdin take 2
  When I run `cat` interactively
  And I type "Hello World!"
 +Then I close the stdin stream
  And the output should contain:
    """
    Hello World!
    """

バックグラウンド ステップを使用して、クローズ stdin ストリームを追加しました。

Then /^I close the stdin stream$/ do
  @interactive.stdin.close()
end

もう一度、この行を aruba/api.rb のメソッドにする必要がありますが、コードは機能します。

于 2012-09-06T04:06:10.427 に答える