当前位置: 首页 > 知识库问答 >
问题:

将多个FactorGirl模型与一个主“公司”模型相关联

酆意智
2023-03-14

我在RSPEC中经常使用factory girl,但这个月我的任务是在测试套件中实现Cucumber故事。我想我可能有个不太确定的问题。

我们的“主”账户模型称为“公司”。用户、员工等属于此。有些直接通过f/k其他人通过委托。我们使用工厂女孩的旧方法设置了许多使用工厂女孩构建的模型实例变量。

i、 e in’spec\u助手。rb'

@grade_system = FactoryGirl.create(:grade_system)
@asset_size = FactoryGirl.create(:asset_size)
@asset_size.grades.create!(FactoryGirl.attributes_for(:grade))
@company = FactoryGirl.create(:company, :asset_size => @asset_size, :grade_system => @grade_system)

这在我看来相当愚蠢。

当我试图用“属性已定义:关联”的适当关联来修复工厂时,我总是会出错。我猜测是因为用户使用属于员工的工厂创建的,两者都使用具有关联的工厂构建:公司,导致了冲突。但这不是唯一的例子。我想我的问题是,这种情况的最佳实践是什么。我觉得如果我可以将一家公司存根并将其分配给所有需要它的工厂,那可能会奏效,或者将所有适当的关联都塞进公司Factory,但无法使用FactoryGirl.build(: user)构建用户。......或者我只是错过了协会是如何运作的?

FactoryGirl.define do
  factory :company do

   sequence(:name)                    { |n|  "Company#{n}" }
   sequence(:subdomain)               { |n| "subdomain#{n}" }  
   first_time_setup                   false

   non_exempt_multiplier              1.2
   exempt_multiplier                  1.2
   executive_multiplier               1.2

   primary_contact_first_name         'Jarrett'
   primary_contact_last_name          'Green'
   primary_contact_email              'tes@test.com'
   primary_contact_phone              '(555) 555-5555'
   hours_considered_part_time         30
   hours_considered_full_time         40

   association :industry
   association :grade_system
   association :asset_size

 end
end

######################################

FactoryGirl.define do
  require 'faker'
  factory :employee do

    association :company
    association :position
    association :branch

    first_name                Faker::Name.first_name
    last_name                 'Smith'
    pay_basis                 'salary'
    current_salary            10000.00
    date_in_position          (Date.today)
    sequence(:internal_id)    { |n| n }  

    user
  end
end

############################################################

FactoryGirl.define do
  factory :user do
    association :company 
    sequence(:login)          {|l|  "user#{l}@test.com"}
    sequence(:first_name)     {|fn| "UserFirstName#{fn}"}
    sequence(:last_name)      {|ln| "UserLastName#{ln}"}
    password                  'thisisthepassword'
    password_confirmation     'thisisthepassword'
  end
end

共有1个答案

百里承业
2023-03-14

处理此问题的一种有趣方法是使用Fixture作为父记录,然后在工厂中定义它们。为每个模型创建一个有效的夹具,然后您可以在工厂定义中分配它,如下所示:

association : grade_system { GradeSystem.find(12345678) }

其中数字是夹具的id。

这种方法有几个优点。首先,它很快,因为您不会每次创建子项时都创建父记录,装置在测试运行开始时加载一次,并在整个过程中保持不变。其次,很容易,每个夹具都会根据夹具的名称给出一个id号-每次运行都是相同的,因此您可以直接使用查找-它们还可以轻松链接关联,这样您就不需要在构建工厂时创建父对象的父对象。第三,它是灵活的,如果需要在创建或html" target="_blank">构建工厂时进行测试,您可以始终传入另一个父级。

您可以避免设备的大多数问题,因为您只创建每种类型中的一种作为父设备使用。

 类似资料:
  • 问题内容: 我正在建立一个包括条目之间关系的通讯簿。我为个人,公司,场地和角色有单独的模型。在我的索引页面上,我想列出每个模型的所有实例,然后对其进行过滤。这样一个人可以轻松地搜索和查找条目。我已经能够使用通用视图列出单个模型,并使用get_extra_context显示另一个模型: 我还可以使用自定义视图列出单个模型: 这是这两个测试的urls.py: 所以我的问题是“如何修改此参数以将更多模型

  • 我正在写一个库在Java,我需要转换(地图)一个模型到另一个,反之亦然。我所做的是实现了一个包含两个泛型类型的抽象转换器类,包含convertTo和convertFrom方法,并从它扩展了我的转换器。 但是对于特定的实现,我可能还需要其他对象来进行转换,我不知道什么是实现这些东西的最佳实践。我想过适配器和门面,但他们似乎不符合我的要求。有没有一个设计模式我可以用来做这个?提前谢谢你。

  • 简介: 我有这些表与他们的模型: 地址表-- 规则: 每个用户只能有一个地址 这里可以进行两种可能的关系规划: > 用户有一个地址和地址属性To User[即一对一关系],但缺点是外键位于地址表中,即user_id字段,通过与其他模型[公司和财产]重复相同的关系,我们将获得地址表中的另外两个外键是[company_id和property_id],那么我们将最终得到3个外键用于3个型号,但每行记录只

  • 问题内容: 我在MySQL数据库中有几个临时表,它们共享相同的架构并具有动态名称。我将如何使用Django与这些表进行交互?一个模型可以从多个表中提取数据吗? 问题答案: 我相信,你可以创建一个工厂函数,该函数将通过动态db_table返回你的模型。 编辑:每次调用此函数时,Django不会创建类属性的新实例。为它创建一个新实例取决于类的名称(Django必须将其缓存在某个地方)。元类可用于在运行

  • 因此,我在JeffreyWay的屏幕广播中了解到,我可以使用Eloquent从注入到另一个模型的模型中获取相关id。 我正在关注他关于Laravel 5.4的系列报道。 在这里,我有一个用户到帖子的一对多关系。 应用程序/帖子 在我的用户模型中,我有一个发布方法,其中注入了发布模型。发布方法用于创建进入数据库的发布条目。 应用/用户 然后,我在PostsController中有一个存储方法,它在我

  • 在本节中,您将添加一些类,这些类用于管理数据库中的电影。这些类是ASP.NET MVC 应用程序中的"模型(Model)"。 您将使用.NET Framework 数据访问技术Entity Framework,来定义和使用这些模型类。Entity Framework(通常称为 EF) 是支持代码优先 (Code First) 的开发模式。代码优先允许您通过编写简单的类来创建对象模型。(相对于"原始