【问题标题】:Build in-test associations using Factory_girl使用 Factory_girl 建立测试中的关联
【发布时间】:2016-10-24 23:08:28
【问题描述】:

我希望能够仅在每个特定测试中创建与 ID 的关联,尽量避免在工厂中定义它们。 我一直在关注Rails 4 Test Prescriptions

避免在 factory_girl 定义中自动定义关联。 根据需要逐个测试设置它们。您将获得更易于管理的结果 测试数据。

class Workspace < ActiveRecord::Base
  has_many :projects
end
class Project < ActiveRecord::Base  
  belongs_to :workspace
end 

这就是我想要的

test "" do
 project_with_id = build_stubbed(:project)
 workspace_with_id = build_stubbed(:workspace)
 workspace_with_id.projects.push(project_with_id)
end 

我正在使用 build_stubbed 创建有效的 ID,这会出现以下错误:

*** RuntimeError 异常:不允许存根模型访问数据库 - Project#save({:validate=>true})

所以,看了工厂女的documentation我想出了工作协会,但我不想在工厂里定义它们,甚至没有特征。

FactoryGirl.define do
  factory :project do
    association :workspace, strategy: :build_stubbed
  end
end 

test "" do
 project = build_stubbed(:project)
end 

这行得通,因为我可以调用 project.workspace,并且两者都有一个有效的 ID

如何创建有效的关联(带 ID),但不接触数据库,只使用 Factory girl 来创建独立对象?

【问题讨论】:

  • 你在使用 rspec 吗?
  • 问题被标记为 minitest 所以假设没有问题很安全

标签: ruby-on-rails ruby unit-testing factory-bot minitest


【解决方案1】:

如果你使用Rspec,你可以这样做

 let!(:user1) { FactoryGirl.create(:user) }
 let!(:user_social_profile1) { FactoryGirl.create(:user_social_profile, user_id: user1.id) }

也在Rspec

let!(:user1) { FactoryGirl.create(:user) }
let!(:user_social_profile1) { FactoryGirl.create(:user_social_profile, user: user1) }

我相信在 minitest/test_unit 中

user1 = FactoryGirl.create(:user)
user_social_profile1 = FactoryGirl.create(:user_social_profile, user_id: user1.id)

很抱歉,我没有解释与使用带有工厂关联的 build_stubbed 相关的问题,this 答案在解释这一点方面做得非常好。

【讨论】:

  • createbuild_stubbed 远远不同。
  • 您好 phil 感谢您的反对,没有人提出这样的论点。但是在这种情况下使用 build_stubbed 时会出现几个问题,所以这就是为什么我提供了使用它的替代方法(有效)。
【解决方案2】:

build_stubbed 初始化记录并伪造持久性。所以你得到的是一个对persisted? 真实回答并且有一个伪造的 ID 的记录。

它非常有用,但在涉及关联时该方法不起作用,因为您需要删除 ActiveRecord 的大部分内容。

相反,您想使用create

before do
  @project = create(:project)
  @workshop = create(:workshop, project: @project)
end

【讨论】:

    【解决方案3】:

    据我了解,您不需要逆运算,例如你会对workspace.projects 为空感到满意,不是吗? 那么这应该对你有用:

    workspace = build_stubbed(:workspace)
    project = build_stubbed(:project, workspace: workspace)
    

    如果你需要workspace.projects,你可以使用这个:

    project = build_stubbed(:project)
    workspace = build_stubbed(:workspace, projects: [project])
    project.workspace = workspace
    

    【讨论】:

      猜你喜欢
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      相关资源
      最近更新 更多