2011-03-20 73 views
2

我有一个规范,像这样:Rspec的+工厂女孩第一个例子工程,第2 +不

require 'spec_helper' 

describe IncomingMailsController do 

    include Devise::TestHelpers 

    before(:each) do 
    @user = Factory.create(:user) 
    @user1 = Factory.create(:user) 
    @group = Factory(:group) 
    @perm1 = Factory.create(:permission, :user => @user) 
    @perm2 = Factory.create(:permission, :user => @user1) 
    end 

    it "xxxxx case 1" do 
    .... 
    end 

    it "xxxxx case 2" do 
    .... 
    end 

第一种情况1,工作正常,但随后的第二个失败:

Failure/Error: @perm1 = Factory.create(:permission, :user => @user) 
    RuntimeError: 
     Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id 
    # ./spec/factories.rb:23 

不每次运行之前每次运行新鲜它阻止?

factories.rb样子:

require 'factory_girl' 

Factory.define :user do |f| 
    f.sequence(:fname) { |n| "fname#{n}" } 
    f.sequence(:lname) { |n| "lname#{n}" } 
    f.sequence(:email) { |n| "email#{n}@google.com" } 
    f.password    "password" 
    f.password_confirmation { |u| u.password } 
    f.invitation_code  "dmbsrv82811" 
end 

Factory.define :group do |f| 
    f.name "myGroup" 
    f.sequence(:private_email) { |n| "myGroup#{n}" } 
end 

Factory.define :permission do |f| 
    f.role_id   1 
    f.group_id do 
    (Group.find_by_name('myGroup')).id 
    end 
    f.creator_id do 
    (User.find_by_fname('fname1')).id 
    end 
end 

感谢

+0

FactoryGirl的版本是什么?自从这篇文章以来,FactoryGirl API是否发生了巨大变化? – 2014-06-28 23:11:57

回答

5

在factories.rb的第23行,你有

(User.find_by_fname('fname1')).id 

这是硬编码找到fname1。然而,你的工厂使用的顺序来定义FNAME:

f.sequence(:fname) { |n| "fname#{n}" } 

这意味着,在第二个规范,为FNAME值将是fname2,不fname1。这是因为序列不会在不同规格之间重置。

所有这一切意味着当您调用User.find_by_fname时,它无法找到具有fname1(仅fname2)的用户,因此它返回nil,这就是为什么您会为nil错误获取被调用的ID。

- 编辑 -

你在做与属性你传递给许可工厂(用于例如用Factory.create(:permission, :user => @user))用户什么?如果不是这样,我想将其更改为类似

Factory.create(:permission, :creator => @user) 

注:如果您没有权限#创作者建立与用户的关联,您需要做的,而

Factory.create(:permission, :creator_id => @user.id) 

在同样,你可能需要更多的如果你的关联是设置正确,就没有必要担心的ID,协会做正确的事为您定义的工厂沿着

Factory.define :permission do |f| 
    f.role_id   1 
    f.association :group, :factory => :group 
    f.association :creator, :factory => :user 
end 

线。

+0

谢谢卢克。我如何根据用户工厂的设置来设置creator_id? – AnApprentice 2011-03-20 18:38:56

+0

类似f.creator_id工厂(:user).id? – AnApprentice 2011-03-20 18:53:06

+1

我已经在上面的答案中回答了,因为它比这些评论更容易格式化文本:) – 2011-03-20 18:57:23