我无法使用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进程传递输入似乎不是理想的解决方案。
我原本预计这是一个相当标准的要求,但尚未取得任何成功。
有什么建议吗?
感谢。
答案 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!
"""