【发布时间】:2013-08-16 14:07:00
【问题描述】:
有时我会遇到想在测试中使用类方法的部分模拟的情况。目前,我正在使用不支持此功能的 minitest(可能是因为这首先不是一个好主意...)。
一个例子:
class ImportRunner
def self.run *ids
ids.each { |id| ItemImporter.new(id).import }
end
end
class ItemImporter
def initialize id
@id = id
end
def import
do_this
do_that
end
private
def do_this
# do something with fetched_data
end
def do_that
# do something with fetched_data
end
def fetched_data
@fetched_data ||= DataFetcher.get @id
end
end
我想单独测试ImportRunner.run 方法(主要是因为ItemImporter#import 很慢/很贵)。在 rspec 我会写一个这样的测试:
it 'should do an import for each id' do
first_importer = mock
second_importer = mock
ItemImporter.should_receive(:new).with(123).and_return(first_importer)
first_importer.should_receive(:import).once
ItemImporter.should_receive(:new).with(456).and_return(second_importer)
second_importer.should_receive(:import).once
ImportRunner.run 123, 456
end
问题的第一部分:是否可以在minitest中做类似的事情?
问题的第二部分:是对象协作的形式
collaborator = SomeCollaborator.new a_param
collaborator.do_work
糟糕的设计?如果是这样,你会如何改变它?
【问题讨论】:
-
你经历过Minitest::Mock的东西吗?
-
是的。
Minitest::Mock提供完整的模拟对象以及方法的部分存根。但不是像我在这种情况下需要的那样部分嘲笑......
标签: ruby oop architecture minitest