如何在 RSpec 期望中使用带有多个参数的 let?

How to use let with multiple params in RSpec expectation?

  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。

执行此操作的好方法是什么?

将参数放在一个数组中,如果你想做类似的事情,可以使用 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

let(:var) { .. } 很容易被误解,但其实很简单。您正在评估一个 Ruby 块,并且从 let Ruby 块中 return 编辑的任何内容都会分配给 :var.

考虑到这一点,您需要 return 来自 let 块的 actual Ruby 对象。

试试这个:

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

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