是否可以在Rspec中使用描述组作为函数?

时间:2016-12-08 09:53:43

标签: ruby rspec

我想将一个示例组作为一个函数。

但是示例组范围中的函数定义会发生这样的错误。

FUNCTION-NAME is not available on an example group (e.g. a `describe` or `context` block).`...

这样的代码。

describe '...' do
  def func(*args)
    # This example group is nested and contains examples.
    describe '...' do
      ...
    end
  end
  func(*args1)
  func(*args2)
end

是否可以避免此错误?或者有其他方法吗?

1 个答案:

答案 0 :(得分:0)

看起来您应该使用RSpec的共享示例。从我的另一个答案中解脱出来,下面是一个应该是自我解释的示例,并演示了使用let块传递参数的各种方法。

如果您愿意,顶部的shared_examples块等同于方法,其余的是演示使用该shared_examples块的示例。

require 'rails_helper'

RSpec.describe Array, type: :class do
  shared_examples 'an array of hashes' do
    it { expect(array).to be_an_instance_of(Array) }

    it 'each element should be an instance of Hash' do
      array.each { |element| expect(element).to be_an_instance_of(Hash) }
    end
  end

  describe 'with an array of hashes' do
    context 'with predefined array' do
      let(:hash) { Hash.new(name: 'hash', value: 'value') }
      let(:array) { [hash, hash, hash] }

      context 'without using shared examples' do
        it { expect(array).to be_an_instance_of(Array) }

        it 'each element should be an instance of Hash' do
          array.each { |element| expect(element).to be_an_instance_of(Hash) }
        end
      end

      context 'using shared examples' do
        it_should_behave_like 'an array of hashes'
      end
    end

    context 'when passing array to shared example' do
      let(:hash) { Hash.new(name: 'hash', value: 'value') }
      let(:myarray) { [hash, hash, hash] }

      it_should_behave_like 'an array of hashes' do
        let(:array) { myarray }
      end

      context 'with use of before(:each) block' do
        before(:each) do
          @myarray = myarray
        end

        it_should_behave_like 'an array of hashes' do
          let(:array) { @myarray }
        end
      end
    end
  end
end