我有一個PlantTree
作業調用PlantTree
服務對象。我想測試這個工作,以確定它使用tree
參數實例化PlantTree
服務並調用call
方法。如何使用MiniTest中的假冒測試硬編碼類
我對該服務的作用或結果不感興趣。它有自己的測試,我不想重複這些測試的工作。
# 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.expect(:call)'需要另一個參數,這是返回值。否則它是一個'ArgumentError'。 –
哎呀,對不起 –