Rails / RSpec:“allow_any_instance_of”不返回多个值

Fli*_*lip 4 ruby rspec ruby-on-rails

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

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
Run Code Online (Sandbox Code Playgroud)

测试失败,因为它只返回第一个值:

expected: ["12589", "12590", "12591", "12592", "12593", "12594"]
got:      ["12589", "12589", "12589", "12589", "12589", "12589"]
Run Code Online (Sandbox Code Playgroud)

我刚刚看到#and_return返回多个值的功能仅在与#allow.

我该怎么做才能#allow_any_instance_of获得这种行为?

编辑:

我正在测试的类名为Dispatcher. 它需要一个 xml 文件,并将其分成与一个对象相关的部分。这些分割部分中的每一部分都由返回恰好一个 ID 的 来获取Importer。然后Dispatcher根据这些 Id 创建一个数组。所以,不,我不希望导入器返回一个数组。

Ser*_*sev 5

我正在测试的类 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
Run Code Online (Sandbox Code Playgroud)