повторно использовать переменную в нескольких примерах для текущей итерации - PullRequest
0 голосов
/ 05 мая 2018

У меня есть переменная, которая немного дороже. Я хочу использовать его для нескольких примеров для каждой коллекции, как показано ниже:

describe MyModel, type: :model do
  describe ".seed" do
    before(:example) do
      described_class.seed
    end

    %w{field_1 field_2 field_3 field_4}.each do |field|
      let(:dynamic_field) { described_class.find_by_code('Car').dynamic_fields.values.detect {|item| item['field'].eql?(field) } }

      it "contains #{field}" do
        expect(dynamic_field).to include( "field" => field )
      end

      it "contains :field_type" do
        expect(dynamic_field).to include "field_type_id"
      end
   end
  end
end

Итак, когда field == 'field_1', тогда let должен быть объявлен и использован для двух примеров. Когда field_2 является текущей итерацией, тогда let должен быть повторно объявлен. К сожалению, если let определен один раз, он останется с тем же значением во всех примерах.

Я пытался использовать before(:example) { @dynamic_field = ... }, но это было объявлено только для первой итерации.

Итак, как мне повторно использовать переменную в нескольких примерах для текущей итерации массива?

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Поскольку смысл let состоит в том, чтобы запоминать значения между примерами, я бы предложил использовать его только для хранения коллекции и перетаскивания самой динамической переменной в блок примера.

let(:dynamic_fields) do
  described_class.find_by_code('Car').dynamic_fields.values
end

%w{field_1 field_2 field_3 field_4}.each do |field|
  it "contains #{field} and :field_type", :aggregate_failures do
    dynamic_field = dynamic_fields.detect {|item| item['field'].eql?(field) }

    expect(dynamic_field).to include( "field" => field )
    expect(dynamic_field).to include "field_type_id"
  end
end

С :aggregate_failures вы группируете свои примеры, но по-прежнему получаете отдельные сообщения об ошибках для каждого ожидания.

https://relishapp.com/rspec/rspec-core/docs/expectation-framework-integration/aggregating-failures

0 голосов
/ 05 мая 2018

Так пусть и перед (: пример) будет назначено значение только один раз. В каком-то смысле они запоминаются. Следовательно, чтобы не писать повторяющийся код, я создал помощника.

В rails_helper.rb:

require 'support/my_helpers'
RSpec.configure do |config|
  config.include MyHelpers
end

А потом в support / my_helpers.rb:

module MyHelpers
  def get_dynamic_data(type, field)
     ....
  end
end

Это не запомнилось. И поэтому для каждой итерации массива я смог получить новое значение, но также не писал повторяющийся код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...