2

我在使用 Aruba 写入标准输入时遇到问题。我尝试了三种方法。

方法一:

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 在字面上传递“<”,而 shell 会用管道做一些魔术。

方法二:

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:'

我不知道,但我假设 cat 没有收到 EOF 字符,因此 cat 保持打开状态,等待进一步输入,然后再写入。有什么方法可以表示输入结束?

方法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!
    """

这种方法有效,但通过 shell 进程传递输入似乎不是理想的解决方案。

我原以为这是一个相当标准的要求,但还没有成功让它工作。

有什么建议么?

谢谢。

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!
    """

我使用后台步骤添加了关闭的标准输入流:

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

应该再次将这一行变成 aruba/api.rb 中的一个方法,但代码有效。

于 2012-09-06T04:06:10.427 回答
0

I pipe in the file已由 Aruba 实施,因此您现在可以执行此操作(与 Allan5 的回答有关)

Scenario: Write to stdin
  Given a file named "infile" with:
    """
    Hello World!
    """
  When I run `cat` interactively
  And I pipe in the file "infile"
  Then the output should contain exactly:
    """
    Hello World!
    """
于 2020-06-05T17:10:46.290 回答