使用Factory_girl

时间:2016-10-24 23:08:28

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

我希望能够仅在每个特定测试中创建具有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&#39; s,这会产生以下错误:

  

*** RuntimeError异常:不允许存根模型访问数据库 - Project#save({:validate =&gt; 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创建独立对象?

3 个答案:

答案 0 :(得分:0)

如果您使用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回答非常好地解释了这一点。

答案 1 :(得分:0)

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

它非常有用,但是当它来到关联时,这种方法不起作用,因为你需要存根大部分的ActiveRecord。

相反,您想使用create

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

答案 2 :(得分:0)

据我了解,您不需要反向工作,例如:你对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