Rails / RSpec:'allow_any_instance_of'不返回多个值

时间:2017-03-10 13:24:35

标签: ruby-on-rails ruby rspec

我在我的一个测试中有这个代码:

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创建一个数组。所以,不,我不希望导入器返回一个数组。

1 个答案:

答案 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