我在我的一个测试中有这个代码:
it 'returns ids when successful' do
allow_any_instance_of(Importer).to receive(:import).and_return('12589', '12590', '12591', '12592', '12593', '12594')
expect(@dispatcher.run).to eq(['12589', '12590', '12591', '12592', '12593', '12594'])
end
测试失败,因为它只返回第一个值:
expected: ["12589", "12590", "12591", "12592", "12593", "12594"]
got: ["12589", "12589", "12589", "12589", "12589", "12589"]
我刚看到#and_return
返回多个值的功能仅在与#allow
一起使用时才有效。
我可以为#allow_any_instance_of
做些什么来获取此行为?
编辑:
我正在测试的课程称为Dispatcher
。它需要一个xml文件,并将其拆分为仅涉及一个对象的部分。每个分割的部分都由Importer
获取,它只返回一个ID。 Dispatcher
然后从这些ID创建一个数组。所以,不,我不希望导入器返回一个数组。
答案 0 :(得分:2)
我正在测试的类Dispatcher为它在输入目录中找到的每个文件调用Importer。
这应该是什么(拦截导入器创建)
class Dispatcher
def run
files.each do |file|
create_importer(file).import
end
end
def create_importer(file)
::Importer.new(file)
end
end
# spec
let(:fake_importer) { ::Importer.new }
before do
allow(@dispatcher).to receive(:create_importer).and_return(fake_importer)
allow(fake_importer).to receive(:import).and_return(your, multiple, values, here)
end