gpt4 book ai didi

ruby - 我如何模拟或覆盖 Kernel.system?

转载 作者:太空宇宙 更新时间:2023-11-03 17:00:08 25 4
gpt4 key购买 nike

模拟或覆盖 Kernel.system 方法的正确方法是什么,以便在调用时:

system("some command")

它不是执行命令,而是执行一些预定义的代码?

我尝试将以下内容添加到我的测试类中:

module Kernel
def system
puts "SYSTEM CALL!!"
end
end

但它并没有像预期的那样工作,而是在执行测试时运行了系统调用。

最佳答案

在某些情况下,执行 expect(Kernel).to receive(:system) 是不够的。

考虑这个例子:

foo_component.rb

class FooComponent
def run
system('....')
end
end

foo_component_spec.rb

require 'spec_helper'

describe FooComponent do
let(:foo_component) { described_class.new }

describe '#run' do
it 'does some awesome things' do
expect(Kernel).to receive(:system).with('....')
foo_component.run
end
end
end

这是行不通的。这是因为Kernel是一个模块,Object(父类)混在Kernel模块中,使得所有的Kernel 在“全局”范围内可用的方法。

这就是为什么正确的测试应该是这样的:

require 'spec_helper'

describe FooComponent do
let(:foo_component) { described_class.new }

describe '#run' do
it 'does some awesome things' do
expect(foo_component).to receive(:system).with('....')
foo_component.run
end
end
end

关于ruby - 我如何模拟或覆盖 Kernel.system?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16655430/

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