我的Rails项目中有一个Rake任务,它通过system
调用执行openssl
。
代码如下:
system('bash', '-c', 'openssl cms -verify...')
我需要在bash
而不是dash
(这是Ubuntu上的默认设置(中运行该命令,以便在命令中使用进程替换。
我需要用rspec创建一个测试,它检查在本例中,参数verify
是否按预期传递。
我尝试过以下几种:
expect(Kernel).to receive(:system) do |args|
expect(args[2]).to match(/verify/)
end
然而,这只给了我发送到系统的第一个字符串中的第三个字母,即bash
中的字母s
,而不是系统调用中发送的第三参数。
我在这里做错了什么?任何建议都将不胜感激。
Args作为顺序参数被传递到块,所以如果你想把它们当作一个数组,你需要do |*args|
:中的splat运算符
expect(Kernel).to receive(:system) do |*args|
expect(args[2]).to match(/verify/)
end
退一步讲,了解块参数是如何工作的很重要,因为它们与方法不同。例如:
def my_fn(*args)
yield(*args)
end
my_fn(1,2,3) { |args| print args }
# => 1
my_fn(1,2,3) { |a, b, c| print [a,b,c] }
# => [1,2,3]
my_fn(1,2,3) { |*args| print args }
# => [1,2,3]
因此,如果您执行了do |args|
(没有splat(,则将args
变量分配给传递给块的第一个参数("bash"
(,并忽略其他参数。