作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个调用 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/
我是一名优秀的程序员,十分优秀!