Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Ruby运行程序并访问其标准输入和输出_Ruby - Fatal编程技术网

如何通过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'

我有一个完全独立的Ruby文件,它从标准输入读取并写入标准输出

我有一些我想尝试的测试用例。如何将输入传递到文件的标准输入,然后根据预期结果测试标准输出


举个例子,下面是我已经弄明白的东西:

有一个文件从标准输入中读取一个数字,将其平方,然后将其写入标准输入

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:)。不过,这仍然是一种有效的方法,谢谢您的帮助!