3

我想运行一些 RSpec 测试来测试 Rails 中的 Ancestry。我想使用 FactoryGirl 为测试创建机构实例。我尝试了下面提到的以下方法,但没有成功创建子记录。

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

我已经搜索了使用 RSpec 进行 Rails Ancestry 测试的示例,但没有发现任何非常有用的东西。如果有人有任何可行的解决方案或可以指向我的资源,那将非常有帮助。提前致谢。

4

1 回答 1

6

选项 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工厂,也可以使用父级创建它:

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
于 2013-12-13T19:07:09.837 回答