2011-03-20 82 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