【问题标题】:Rails FactoryGirl Duplicated FactoryRails FactoryGirl Duplicated Factory
【发布时间】:2013-01-01 07:39:22
【问题描述】:

我的 factory.rb 文件中定义了以下工厂:

require 'factory_girl'

FactoryGirl.define do
    sequence(:email) {|n| "person-#{n}@example.com" }

    factory :country do
        ...
    end
    factory :state do
        country
        ...
    end
    factory :school do
        name "Test School"
        country
        state
    end
    factory :user do
        school
        email
        ... 
    end
end

在 rspec 中测试时,在我的一个描述符中调用 FactoryGirl.create(:school) 会导致创建两个名为“Test School”的学校。

我认为 factory.rb 中定义的工厂只是一堆未保存的实例对象,有人能解释一下我为什么会遇到这个问题吗?

这是确切的 rspec:

require 'spec_helper'
describe "school login" do
  it "displays a success message upon successful login to school",do  
    school = FactoryGirl.create(:school)
    user = FactoryGirl.create(:user, :username => "jdoe")
    School.all.each do |school|
      puts school.name #2x => "Test School"
    end
    visit school_path(user.school)
    click_link('login')
    fill_in "username", :with => "jdoe"
    fill_in "password", :with => "secret"
    click_button "Sign in"
    expect(page).to have_selector(".alert-success")
  end
end

【问题讨论】:

    标签: ruby-on-rails-3 rspec factory-bot


    【解决方案1】:

    这条线创建了第一所学校

    school = FactoryGirl.create(:school)
    

    这一秒:

    user = FactoryGirl.create(:user, :username => "jdoe")
    

    这是因为在您的用户工厂中,您定义了每个用户都应该拥有一所学校,因此 FactoryGirl 正在为您创建它。如果您希望您的用户与第一所学校相关联,您可以执行以下操作:

    user = FactoryGirl.create(:user, :username => "jdoe", :school => school)
    

    【讨论】:

      【解决方案2】:

      上下文代码是什么?您是如何发现创建了 2 个schools 的?

      在您声明 create(:object)build(:object) 之前,用 ruby​​ 文件 ( factory ) 编写的代码既不会保存到数据库中,也不会创建为对象。

      # Returns a User instance that's not saved
      user = FactoryGirl.build(:user)
      
      # Returns a saved User instance
      user = FactoryGirl.create(:user)
      

      更多详情请参考:https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#using-factories

      【讨论】:

      • 我不知道“上下文代码”是什么,但我在上面添加了相关的rspec。请注意,我正在输出每所学校及其各自的名称 - 这就是我确定创建两所学校的方式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多