Фабрики с родословной для тестирования

Я хочу запустить несколько тестов RSpec, чтобы протестировать Ancestry в Rails. Я хочу использовать FactoryGirl для создания экземпляров Institution для тестов. Я пробовал следующие способы, упомянутые ниже, но не смог создать дочерние записи.

файл factory.rb

  factory :institution do
    # sequence(:name) { |n| "University of XYZ#{n}" }
  end

И в тестах я использую следующие стили Стиль: 1

let(:institution){ FactoryGirl.create(:institution, name: "ABC Institution") }
let(:institution_child) {FactoryGirl.create(:institution, name: "Sub Institution", ancestry: institution.id) }

Стиль: 2

let(:institution){ FactoryGirl.create(:institution, name: "ABC Institution") }
let(:institution_child) {FactoryGirl.create(:institution, name: "Sub Institution", parent_id: institution.id) }

Стиль: 3

describe Institution do
  before do
    @institution = Institution.create({:institution, name: "ABC Institution"})
    @institution_child = Institution.create(:institution, name: "Sub Institution"}
  end

  it "should create the child institution" do
    assigns(:institution_child).should be_a_new(Institution)
    assigns(:institution_child).parent_id.should eq @institution.id
  end
end

Я искал примеры тестирования Rails Ancestry с использованием RSpec, но не нашел ничего полезного. Если у кого-то есть какое-либо рабочее решение или источники, на которые они могли бы мне указать, это будет очень полезно. Заранее спасибо.


person bhvd    schedule 13.12.2013    source источник


Ответы (1)


Вариант 1, используя вложенные фабрики:

factory :institution do
  sequence(:name) { |n| "ABC Institution" }

  factory :institution_child do |f|
    # f.sequence(:name) { |n| "Here you can override name for child" }
    f.parent FactoryGirl.create(:institution)
  end
end

Теперь в спецификациях вы можете просто вызвать :institution_child factory, а также создать его с родителем:

describe Institution do
  let!(:institution_child) {FactoryGirl.create(:institution_child, name: "Sub Institution") }

  it "should create the child institution" do
    assigns(:institution_child).should eq institution_child
    assigns(:institution_child).parent.should eq institution_child.parent

    # just for test
    institution_child.parent.should_not be_nil
  end
end

Вариант 2, используя черты:

factory :institution do
  sequence(:name) { |n| "ABC Institution" }

  trait :with_parent do
    after(:build) do |o|
      o.parent = FactoryGirl.create(:institution) 
    end
  end
end

Теперь в спецификациях вы можете использовать это так:

describe Institution do
  let(:institution_child) {FactoryGirl.create(:institution_child,:with_parent, name: "Sub Institution") }

  #...
end
person ole    schedule 13.12.2013
comment
Будут ли эти спецификации находиться в файле spec/model/institution_spec.rb? - person Jay Killeen; 28.01.2015
comment
Оформление фабрик должно быть во внешнем файле. github.com/thoughtbot/factory_girl_rails#configuration - person ole; 28.01.2015