有时我会遇到想在测试中使用类方法的部分模拟的情况。目前,我正在使用不支持此功能的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
糟糕的设计?如果是这样,你会如何改变它?