Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在每个当前迭代的多个示例中重用变量_Ruby On Rails_Ruby_Rspec - Fatal编程技术网

Ruby on rails 在每个当前迭代的多个示例中重用变量

Ruby on rails 在每个当前迭代的多个示例中重用变量,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我有一个变量有点贵。我希望对每个集合重复使用它,如下所示: 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

我有一个变量有点贵。我希望对每个集合重复使用它,如下所示:

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
,并用于两个示例。当
字段_2
是当前迭代时,则应重新声明
let
。不幸的是,一旦定义了一次let,它在整个示例中都保持相同的值

我试图在(:example){@dynamic_field=…}之前使用
,但这也只是在第一次迭代中声明的

那个么,我应该如何在当前数组迭代的多个示例中重用变量呢?

所以let和before(:example)将只分配一次值。从某种意义上说,它们是被记忆的。因此,为了避免编写重复的代码,我创建了一个助手

在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

这并没有被记录下来。因此,对于每个数组迭代,我都能够获得一个新值,同时也不需要编写重复的代码。

由于让
在示例之间存储值,我建议只使用它来存储集合,并将动态变量本身拉到示例块中

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
可以对示例进行分组,但仍然可以为每个期望获得单独的失败消息