如何通过Ruby运行程序并访问其标准输入和输出
我有一个完全独立的Ruby文件,它从标准输入读取并写入标准输出 我有一些我想尝试的测试用例。如何将输入传递到文件的标准输入,然后根据预期结果测试标准输出如何通过Ruby运行程序并访问其标准输入和输出,ruby,Ruby,我有一个完全独立的Ruby文件,它从标准输入读取并写入标准输出 我有一些我想尝试的测试用例。如何将输入传递到文件的标准输入,然后根据预期结果测试标准输出 举个例子,下面是我已经弄明白的东西: 有一个文件从标准输入中读取一个数字,将其平方,然后将其写入标准输入 square.rb: #!/usr/local/bin/ruby -w input = STDIN.read # square it puts input.to_i ** 2 require 'minitest/autorun'
举个例子,下面是我已经弄明白的东西: 有一个文件从标准输入中读取一个数字,将其平方,然后将其写入标准输入
square.rb
:
#!/usr/local/bin/ruby -w
input = STDIN.read
# square it
puts input.to_i ** 2
require 'minitest/autorun'
def pass_input_to_file(input)
# complete code here
end
class Test < Minitest::Test
def test_file
assert_equal pass_input_to_file(2), 4
end
end
完成test.rb的pass\u input\u to\u file
方法:
#!/usr/local/bin/ruby -w
input = STDIN.read
# square it
puts input.to_i ** 2
require 'minitest/autorun'
def pass_input_to_file(input)
# complete code here
end
class Test < Minitest::Test
def test_file
assert_equal pass_input_to_file(2), 4
end
end
要求“小型测试/自动运行”
def将_输入_传递到_文件(输入)
#完整的代码在这里
结束
类测试
测试这一点的最简单方法可能是让程序先查看是否传递了任何参数。大概是这样的:
#!/usr/local/bin/ruby -w
input = ARGV[0] || STDIN.read
# square it
puts input.to_i ** 2
然后你可以进行测试:
def pass_input_to_file(input)
`path/to/file #{input}`.to_i
end
否则,我会尝试自动化子shell之类的东西
另外,对于更复杂的程序,使用或使用CLI gem可能比直接查看ARGV要好。最简单的测试方法可能是让程序先查看是否传递了任何参数。大概是这样的:
#!/usr/local/bin/ruby -w
input = ARGV[0] || STDIN.read
# square it
puts input.to_i ** 2
然后你可以进行测试:
def pass_input_to_file(input)
`path/to/file #{input}`.to_i
end
否则,我会尝试自动化子shell之类的东西
另外,对于更复杂的程序,使用或CLI gem可能比直接查看ARGV要好。在调用ruby脚本时,可以使用提交STDIN
需要“open3”
def将_输入_传递到_文件(输入)
输出,_status=Open3.capture2('path_to_script',:stdin_data=>input)
输出
结束
调用ruby脚本时,可以使用提交STDIN
需要“open3”
def将_输入_传递到_文件(输入)
输出,_status=Open3.capture2('path_to_script',:stdin_data=>input)
输出
结束
谢谢你的回答,克里斯!:)不幸的是,square.rb
文件是任何类型文件(即使是非Ruby)的替代品,它们分别读取和写入STD in和OUT。一个我们无法控制的。执行shell代码的backticks
思想是我在发布这个问题后立即开始使用的,但它在Ruby中比Ruby本身更具Bash:)。不过,这仍然是一种有效的方法,谢谢您的帮助!谢谢你的回答,克里斯!:)不幸的是,square.rb
文件是任何类型文件(即使是非Ruby)的替代品,它们分别读取和写入STD in和OUT。一个我们无法控制的。执行shell代码的backticks
思想是我在发布这个问题后立即开始使用的,但它在Ruby中比Ruby本身更具Bash:)。不过,这仍然是一种有效的方法,谢谢您的帮助!