gpt4 book ai didi

ruby-on-rails - Rspec:检查系统调用的内容

转载 作者:行者123 更新时间:2023-12-04 07:26:35 25 4
gpt4 key购买 nike

我的 Rails 项目中有一个 Rake 任务,它执行 openssl通过 system称呼。
代码如下所示: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
但是,这只会给我发送到系统的第一个字符串中的第三个字母 - 即字母 s来自 bash - 而不是系统调用中发送的第三个参数。
我在这里做错了什么?任何建议将不胜感激。

最佳答案

参数作为顺序参数传递给块,因此如果要将它们视为数组,则需要在 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" )并忽略其他参数。

关于ruby-on-rails - Rspec:检查系统调用的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68183045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com