2012-09-10 147 views
2

我刚刚开放Factory_Girl,我想弄清楚如何建立依赖工厂,大多数问题似乎由于新版本而过时。工厂女孩协会4.0.0

我使用的是联想,但不是创建关联的对象之外,该对象似乎不相关或以任何方式

基本上这里涉及到的主要对象是我所

factory :computer do 
    serial_no "12345" 
end 

factory :allocation do 
    association :computer_id, factory: :computer 
end 

分配belongs_to计算机和计算机has_many分配 基本上分配是任何时候计算机被移动或什么的记录。

我不知道我在做什么错,但每次运行这个时,分配的computer_id都是'1',但计算机的ID是随机的(通常是0-20之间的数字),并且那么我的测试失败,因为它找不到合适的计算机对象。

编辑: 就好像它不够混乱,实际的班级名称是Assignment,我试图简单。下面是涉及的实际代码,实际的代码没有问题,因为在创建过程中,computer_id和user_id作为参数传递给create方法。

describe "GET index" do 
    it "assigns assignments as @assignment" do 
    Assignment.any_instance.stubs(:valid?).returns(true) 
    assignment = FactoryGirl.create :associated_assignment 
    get :index, {}, valid_session 
    assigns(:assignments).should eq([assignment]) 
    end 
end 

所涉及的工厂是

factory :user do 
    fname "John" 
    lname "Smith" 
    uname "jsmith" 
    position "placeholder" 
end 

factory :computer do 
    asset_tag "12345" 
    computer_name "comp1" 
    make "dell" 
    model "E6400" 
    serial_no "abc123" 
end 

factory :associated_assignment, class: Assignment do 
    association :user_id, factory: :user 
    association :computer_id, factory: :computer 
    assign_date '11-11-2008' 
end 

而且控制器是:

def index 
    @assignments = [] 
    @computers = Computer.all 
    Computer.all.each do |asset| 
    @assignments << Assignment.where(:computer_id => asset.id).order("assign_date ASC").last 
    end 
    respond_to do |format| 
    format.html # index.html.erb 
    format.json { render json: @assignments } 
    format.xls { send_data @assignments.to_xls } 
end 

目前我运行这种替代测试来检查我的id:

describe "GET index" do 
    it "assigns assignments as @assignment" do 
    Assignment.any_instance.stubs(:valid?).returns(true) 
    assignment = FactoryGirl.create :associated_assignment 
    get :index, {}, valid_session 
    assigns(:computers).should eq([assignment]) 
    end 
end 

其中返回如此mething到以下内容,其中计算机的ID是随机的,但分配的COMPUTER_ID的影响始终为1

Failure/Error: assigns(:computers).should eq([assignment]) 

    expected: [#<Assignment id: 12, user_id: 1, computer_id: 1, assign_date: "2008-11-11", created_at: "2012-09-10 23:59:48", updated_at: "2012-09-10 23:59:48">] 
     got: [#<Computer id: 14, serial_no: "abc123", asset_tag: 12345, computer_name: "comp1", make: "dell", model: "E6400", created_at: "2012-09-10 23:59:48", updated_at: "2012-09-10 23:59:48">] 

回答

2

工厂并不能保证什么IDS什么都会有。但您可以通过以下方式找到适当的计算机对象:

allocation = FactoryGirl.create(:allocation) 
computer = allocation.computer 
+1

感谢在清除了,虽然我以什么关联的点,现在是,如果所做的只是产生真糊涂与工厂没有保证关系的工厂称之为工厂。 – corodio8

+0

这种关系是有保证的,只是不是id。您可以在工厂创建分配,并免费获得关联的计算机。 –

+0

究竟是什么决定了这种关联?在我的情况下,我试图将分配上的computer_id与工厂上的id链接(在实际代码中工作正常),但是computer_id与关联计算机的id完全无关。 – corodio8

1

我认为问题出在:computer_id vs.:computer。下面是做到这一点的一种方式是使用FactoryGirl的推断工厂和协会的能力:

factory :computer do 
    serial_no "12345" 
end 

factory :allocation do 
    computer 
end 

此外,如果你想每台计算机在您的规格唯一的序列号,使用:

sequence :serial_no do |n| 
    "1234#{n}" 
end 

factory :computer do 
    serial_no 
end 

factory :allocation do 
    computer 
end 

厂女孩知道你的模型及其关联,所以它可以提取它们并推断如何创建相关对象。

这样:

allocation = FactoryGirl.create :allocation 

创建一个配置对象,并与12340.序列号的计算机对象的ID将已经在分配的COMPUTER_ID场这样的关系完全建立相关的电脑。 allocation.computer将工作,并且allocation.computer_id将与allocation.computer.id相同。

这使用FactoryGirl的一些语法糖。你可以通过提供协会(场)名称及厂名更明确:

factory :computer do 
    serial_no "12345" 
end 

factory :allocation do 
    association :computer, factory: :computer 
end