gpt4 book ai didi

ruby-on-rails-3 - 厂妹,附属工厂

转载 作者:行者123 更新时间:2023-12-04 17:02:10 25 4
gpt4 key购买 nike

更新

我又开始使用 Fixtures 了。 IMOP,夹具比工厂好得多;更容易使用,更容易写,更容易理解(没有魔法)。我的建议:将您的测试库限制在非常基础的范围内(听听 DHH)...使用带有装置的 minitest。

原帖

在我的应用中,一个地区有很多学校,一个学校有很多用途,一个用户有很多账户,一个账户有一个角色。为了创建完整的工厂进行测试,我需要创建一个跨工厂持续存在的用户和学校。我在最近的尝试中遇到了“堆栈级别太深”的错误。

我的 user_test.rb

 FactoryGirl.define do

factory :district do
name "Seattle"
end

factory :school do
association :primarycontact, factory: :user # expecting this to attach the user_id from factory :user as :primary contact_id in the school model
association :district, factory: :district # expecting this to attach the :district_id from the :district factory as :district_id in the school model
name "Test School"
end

factory :user do, aliases: [:primarycontact]
email "adam@example.com"
name "Who What"
username "wwhat"
password "123456"
password_confirmation { |u| u.password }
association :school, factory: :school # expecting this to create :school_id in the users model, using the :school factory
end

factory :role do
name "student"
end

factory :account do
association :user, factory: :user
association :role, factory: :role
end

end

因此,我正在尝试使用 FactoryGirl.create(:account)... 来创建一个帐户,该帐户具有上述工厂的用户和角色,以及与学区相关联的学校相关联的用户。这对我不起作用。在失败的测试中,我收到“堆栈级别太深”错误。而且,我相信我在每个 DatabaseCleaner.clean 之前都会在每个新工厂之前清除测试数据库。

调用这些工厂的测试是:
describe "User integration" do

def log_em_in
visit login_path
fill_in('Username', :with => "wwhat")
fill_in('Password', :with => "123456")
click_button('Log In')
end

it "tests log in" do
user = FactoryGirl.create(:account)
log_em_in
current_path.should == new_user_path
end

end

.
current_path.should == new_user_path returns unknown method error 'should'

如何改进此代码以正确嵌套工厂并获取 current_user 以便继续测试?

楷模

学校.rb
  belongs_to :district
belongs_to :primarycontact, :class_name => "User"
has_many :users, :dependent => :destroy

用户名
  belongs_to :school
has_many :accounts, :dependent => :destroy

区.rb
  has_many :schools

账号.rb
  belongs_to :role
belongs_to :user

角色.rb
  has_many :accounts
has_many :users, :through => :accounts

最佳答案

您的基本问题是您的 user 工厂和 school 工厂之间存在循环依赖关系,这是因为您在创建学校时创建了 primarycontact(用户),然后该用户创建了学校,依此类推。

您可以通过更改在 school 工厂中定义 user 关联的方式来解决此问题。不过,在这样做之前,我建议使用关联的速记符号作为一般规则。所以替换这个:

factory :account do
association :user, factory: :user
association :role, factory: :role
end

有了这个:
factory :account do
user
role
end

使用这种简化,以下工厂将执行您想要的操作,而不会产生任何循环依赖:
FactoryGirl.define do

factory :district do
name "Seattle"
end

factory :school do |school|
district
primarycontact
name "Test School"
after_build do |s|
s.primarycontact.school = s
end
end

factory :user do
email "adam@example.com"
name "Who What"
username "wwhat"
password "123456"
password_confirmation { |u| u.password }
school
end

factory :primarycontact, class: "User" do
# add any attributes you want the primarycontact user to have here
end

factory :role do
name "student"
end

factory :account do
user
role
end

end

请注意,我所做的是使用 primarycontact 选项为 class: "User" 创建一个工厂。与 user 工厂不同,该工厂默认不创建 school,避免了循环依赖。

然后在 school 工厂中,我使用 after_build 回调将学校本身分配给 school 上的 primarycontact 关联,而不是创建新学校(这会导致您的工厂出现问题)。

希望这是有道理的。请注意,在最新版本的 factory_girl 中回调语法已更改,有关详细信息,请参阅 documentation

关于ruby-on-rails-3 - 厂妹,附属工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14087972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com