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 创建一个数组。所以,不,我不希望导入器返回一个数组。
我正在测试的类 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)