我有一个PlantTree
调用PlantTree
服务对象的工作。我想测试该作业以确定它是否PlantTree
使用参数实例化服务tree
并调用该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
作业的方法中是硬编码的。所以我不能伪造它并将其作为依赖项传递。有没有办法可以在 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 堆栈无法做到这一点,我愿意使用外部库。