如何在RSpec期望中使用多个参数?

时间:2015-01-07 22:56:16

标签: ruby rspec mocking

  describe 'Spec' do
    let( :qux    ){ double 'qux' }
    let( :params ){ :foo, :bar, :baz }

    specify 'success' do
      qux.use :foo, :bar, :baz

      expect( qux ).to have_received( :use ).with params

这会生成语法错误,因为:foo, :bar, :baz无效Ruby。

这样做的好方法是什么?

3 个答案:

答案 0 :(得分:2)

如果你想做类似的事情,把params放在一个数组中并使用splat。此外,既然你在嘲笑qux,那么你将不得不用use方法:

RSpec.describe 'Spec' do
    let( :qux    ){ double 'qux' }
    let( :params ){ [:foo, :bar, :baz] }

    specify 'success' do
      qux.stub(:use)
      qux.use :foo, :bar, :baz
      expect( qux ).to have_received( :use ).with *params
    end
end

答案 1 :(得分:1)

let(:var) { .. }很容易被误解,但实际上非常简单。您正在评估Ruby块,并且从Ruby块返回的任何内容都将分配给:var。

考虑到这一点,您需要从let块返回实际的 Ruby对象。

试试这个:

let(:params) do
  [:foo, :bar, :baz]
end

答案 2 :(得分:1)

Rspec 3.0 or greater中,您必须将其编写为

require 'rspec'

RSpec.describe 'Spec' do
  let( :qux    ) { double 'qux' }
  let( :params ) { [:foo, :bar, :baz] }

  it 'success' do
    expect(qux).to receive(:use).with(*params)
    qux.use(*params)
  end
end

当我进行此测试时: -

Arup-iMac:arup_ruby$ rspec spec/test_spec.rb
.

Finished in 0.04997 seconds (files took 0.0904 seconds to load)
1 example, 0 failures