gpt4 book ai didi

ruby-on-rails - 如何在 MiniTest 中使用假的来测试硬编码类

转载 作者:行者123 更新时间:2023-11-28 21:27:40 24 4
gpt4 key购买 nike

我有一个调用 PlantTree 服务对象的 PlantTree 作业。我想测试作业以确定它使用 tree 参数实例化 PlantTree 服务并调用 call 方法。

我对服务的作用或结果不感兴趣。它有自己的测试,我不想为工作重复这些测试。

# app/jobs/plant_tree_job.rb
class PlantTreeJob < ActiveJob::Base
def perform(tree)
PlantTree.new(tree).call
end
end

# app/services/plant_tree.rb
class PlantTree
def initialize(tree)
@tree = tree
end

def call
# Do stuff that plants the tree
end
end

如您所见,PlantTree 类被硬编码在作业的 perform 方法中。所以我不能伪造它并将其作为依赖项传递。有没有办法在执行方法的生命周期内伪造它?像...

class PlantTreeJobTest < ActiveJob::TestCase
setup do
@tree = create(:tree)
end

test "instantiates PlantTree service with `@tree` and calls `call`" do
# Expectation 1: PlantTree will receive `new` with `@tree`
# Expectation 2: PlatTree will receive `call`
PlantTreeJob.perform_now(@tree)
# Verify that expections 1 and 2 happened.
end
end

我正在使用 Rails 的默认堆栈,它使用 MiniTest。我知道这可以用 Rspec 来完成,但我只对 MiniTest 感兴趣。如果仅使用 MiniTest 或默认的 Rails 堆栈无法做到这一点,我愿意使用外部库。

最佳答案

你应该可以做类似的事情

mock= MiniTest::Mock.new
mock.expect(:call, some_return_value)
PlantTree.stub(:new, -> (t) { assert_equal(tree,t); mock) do
PlantTreeJob.perform_now(@tree)
end
mock.verify

这会在 PlantTree 上 stub 新方法,检查 tree 的参数,然后返回一个模拟而不是 PlantTree 实例。该模拟进一步验证调用。

关于ruby-on-rails - 如何在 MiniTest 中使用假的来测试硬编码类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35013009/

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