用Aruba / Cucumber写入stdin

时间:2012-08-29 02:21:19

标签: ruby cucumber bdd functional-testing aruba

我无法使用Aruba写入标准输入。我尝试了三种方法。

方法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正在传递'&lt;'通过字面意思,而shell会用管道做一些魔法。

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

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

我原本预计这是一个相当标准的要求,但尚未取得任何成功。

有什么建议吗?

感谢。

2 个答案:

答案 0 :(得分:2)

编辑:我尝试使用交互模式来管理文件但是在实际使用中我发现它比使用sh -c "process < infile"慢得多,我不太清楚为什么会这样,这可能是额外的开销写入Ruby @interactive.stdin.write(input)中的stdin,或者可能需要关闭管道@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,我删除了对管道(&lt;)的尝试,而是以交互方式运行该进程。在后端我写了这一步:

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中的方法,但代码可以正常工作。

答案 1 :(得分: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!
    """