Rspec:检查系统调用的内容



我的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"(,并忽略其他参数。

相关内容

  • 没有找到相关文章

最新更新