2015-12-15 28 views
0

我在我的Rails應用程序中使用mongoid。因爲它不支持燈具,所以我使用factory_girl代替。然後,我建立兩個模型:是factory_girl的關聯參考或重複產生的?

class User 
    include Mongoid::Document 

    field name, type: String 
    validates :name, uniquess: true 
end 

class Post 
    include Mongoid::Document 

    belongs_to :user 
end 

然後我建立了兩家工廠像belowing:

FactoryGirl.define do 
    factory :user do 
    name 'user' 
    end 
end 

FactoryGirl.define do 
    factory :post1, class: 'Post' do 
    user 
    end 
end 

FactoryGirl.define do 
    factory :post2, class: 'Post' do 
    user 
    end 
end 

就像上面,創建具有兩個職位的用戶,這是我想要的。

我按照燈具的思想,即在運行測試用例之前準備的所有數據。

Mongoid::default_client.database.drop 
FactoryGirl.lint 

但是,它會產生一個錯誤,因爲在後廠多次創建用戶不闖民宅用戶工廠以前的定義:

rake aborted! 
FactoryGirl::InvalidFactoryError: The following factories are invalid: 

* user - 
message: 
Validation of User failed. 
summary: 
The following errors were found: Name is already taken 
resolution: 
Try persisting the document with valid data or remove the validations. (Mongoid::Errors::Validations)/home/hello/workspace/scaffold/vendor/bundle/ruby/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/linter.rb:14:in `lint!' 
/home/hello/workspace/scaffold/vendor/bundle/ruby/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl/linter.rb:4:in `lint!' 
/home/hello/workspace/scaffold/vendor/bundle/ruby/2.1.0/gems/factory_girl-4.5.0/lib/factory_girl.rb:59:in `lint' 
/home/hello/workspace/scaffold/test/test_helper.rb:6:in `<top (required)>' 
/home/hello/workspace/scaffold/vendor/bundle/ruby/2.1.0/gems/activesupport-4.2.5/lib/active_support/dependencies.rb:274:in `require' 
/home/hello/workspace/scaffold/vendor/bundle/ruby/2.1.0/gems/activesupport-4.2.5/lib/active_support/dependencies.rb:274:in `block in require' 
/home/hello/workspace/scaffold/vendor/bundle/ruby/2.1.0/gems/activesupport-4.2.5/lib/active_support/dependencies.rb:240:in `load_dependency' 
/home/hello/workspace/scaffold/vendor/bundle/ruby/2.1.0/gems/activesupport-4.2.5/lib/active_support/dependencies.rb:274:in `require' 
/home/hello/workspace/scaffold/vendor/bundle/ruby/2.1.0/gems/railties-4.2.5/lib/rails/test_unit/sub_test_task.rb:114:in `block (3 levels) in define' 
/home/hello/workspace/scaffold/vendor/bundle/ruby/2.1.0/gems/railties-4.2.5/lib/rails/test_unit/sub_test_task.rb:114:in `each' 
/home/hello/workspace/scaffold/vendor/bundle/ruby/2.1.0/gems/railties-4.2.5/lib/rails/test_unit/sub_test_task.rb:114:in `block (2 levels) in define' 
/home/hello/workspace/scaffold/vendor/bundle/ruby/2.1.0/gems/railties-4.2.5/lib/rails/test_unit/sub_test_task.rb:113:in `each' 
/home/hello/workspace/scaffold/vendor/bundle/ruby/2.1.0/gems/railties-4.2.5/lib/rails/test_unit/sub_test_task.rb:113:in `block in define' 
/home/hello/workspace/scaffold/vendor/bundle/ruby/2.1.0/gems/railties-4.2.5/lib/rails/test_unit/sub_test_task.rb:31:in `create_and_run_single_test' 
/home/hello/workspace/scaffold/vendor/bundle/ruby/2.1.0/gems/railties-4.2.5/lib/rails/test_unit/sub_test_task.rb:17:in `invoke_rake_task' 
/home/hello/workspace/scaffold/vendor/bundle/ruby/2.1.0/gems/railties-4.2.5/lib/rails/test_unit/testing.rake:8:in `block in <top (required)>' 
Tasks: TOP => test:single 
(See full trace by running task with --trace) 
+0

你擦你的數據庫? – CallmeSurge

+0

是的。這行做到這一點:Mongoid :: default_client.database.drop – Run

回答

0

在用戶模式,我用它下面的代碼做你有一個驗證:

validates :name, uniquess: true 

對於通過FactoryGirl代uniq的名字,你應該使用序列:

sequence(:name) { |n| "person#{n}" } 
+0

我編輯我的問題,現在有一個用戶和兩個職位(belongs_to同一個用戶) – Run

0

定義您user工廠通過使用生成的序列發出獨特的名字:

FactoryGirl.define do 
    sequence :username do |n| 
     "Name#{n}" 
    end 
    factory :user do 
     name { generate :username } 
    end 
end 

編輯,以反映最新的問題:

工廠都沒有固定裝置,它們不定義一個特定的對象,但一種創建一系列的方法。

要讓用戶擁有兩個或多個帖子 - 爲UserPost定義一個工廠,然後在測試中生成對象。每個帖子不需要工廠,通常每個模型都有一個工廠,可以處理一些特定的案例'traits'

例如使用RSpec的:

let(:user){ create :user } 
let(:first_post_of_this_user) { create :post, user: user } 
let(:second_post_of_same_user){ create :post, user: user } 

或只是簡單的紅寶石:

user = FactoryGirl.create :user 
posts = 2.times.map{ FactoryGirl.create :post, user: user } 
+0

我編輯我的問題,現在有一個用戶和兩個職位(belongs_to同一個用戶) – Run

+0

看到更新的答案如何使帖子引用相同的生成用戶 – Vasfed

+0

謝謝。這就是我所迷惑的,我無法找到一個地方來定義所有的數據,而不是一個複雜的模式來組織它們。 – Run

0

您可以使用任意一個優秀的創業板創造name, email, number, phone

Faker

w^hile Faker隨機生成數據,返回的值不是 保證是唯一的。

FactoryGirl.define do 
    factory :user do 
    name {Faker::Name.name } 
    end 
end 
+0

我編輯了我的問題,現在有一個用戶和兩個帖子(belongs_to同一個用戶) – Run

0

的問題不在於名稱驗證,問題是你不想要的工廠產生多個用戶。

這是錯誤的...... class 'User'...這是告訴factory_girl建立一個User對象而不是Post對象。另外你不需要定義兩個相同的工廠。

你是什麼意思做的是...

FactoryGirl.define do 
    factory :post, class: Post 
end 

然後......

user = create(:user) 
post1 = create(:post, user: user) 
post2 = create(:post, user: user) 
+0

謝謝。也許我更習慣於作爲測試新手的燈具模式。 – Run