gpt4 book ai didi

ruby - 如何测试来自 rake 任务的系统调用

转载 作者:数据小太阳 更新时间:2023-10-29 08:37:24 25 4
gpt4 key购买 nike

假设我有一个非常简单的 Rake 任务:

task :test do
system "bundle exec rspec spec"
end

我尝试通过打断 ::Kernel.system 方法调用来测试它:

describe "test" do

before { allow(::Kernel).to receive(:system) }

it "runs 'bundle exec rspec spec'" do
expect(::Kernel).to receive(:system).with "bundle exec rspec spec"
Rake::Task[:test].invoke
end
end

但是这个方法好像根本就没有 stub 。相反,我遇到了调用测试套件的无限迭代循环。

它有什么问题,以及如何正确 stub 系统调用?

最佳答案

请注意,Kernel 是一个包含在每个 ruby​​ Object 中的模块。而 Kernel#system 是一个实例方法(不是类方法)。

一个解决方案(尽管是 discouraged by rspec maintainers )是使用“任何实例”:

it "runs 'bundle exec rspec spec'" do
expect_any_instance_of(Kernel).to receive(:system).with "bundle exec rspec spec"
Rake::Task[:test].invoke
end

为了使用常规的expectallow,您需要接收消息的对象的实际实例。对于 Rake 任务,这将很麻烦(尽管并非不可能 - 参见 this question ) - 它们在顶层上下文中执行。

我建议您将系统 调用封装到实用程序类方法中,并期望 那些方法。这将使测试更容易,并且您可以使用显式类和实例。

关于ruby - 如何测试来自 rake 任务的系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28275886/

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