ruby-on-rails - 有测试血统的工厂

标签 ruby-on-rails rspec factory-bot ancestry

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

factories.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 测试的示例,但没有找到任何非常有用的东西。如果有人有任何可行的解决方案或资源可以指点我,那将非常有帮助。提前致谢。

最佳答案

选项 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

现在在 specs 中,你可以只调用 :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

关于ruby-on-rails - 有测试血统的工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20557022/

相关文章:

ruby-on-rails - 去除 在 Rails 中

ruby-on-rails - rails + ruby 1.9 "invalid byte squence in US-ASCII"

jquery - RailsTutorial 11.2.5 Ajax 调用未返回成功

ruby-on-rails-3 - 如何使用 Rspec 测试载波版本大小

ruby-on-rails - rails 4 回形针 : undefined method `brand_logo_image_content_type' for #<Batch:0x431a408>

ruby-on-rails - 如何使用 Rails 3 Rspec 和 Capybara 访问 Selenium 2 的默认 webdriver?

ruby-on-rails - 使用 Rspec 打桩 sleep 方法。

ruby-on-rails - created_at 的 Rspec/FactoryGirl 测试顺序

ruby-on-rails - 平均评级法的 Rspec 模型测试

ruby-on-rails - 具有 has_many 关联的 FactoryGirl build_stubbed 策略