2015-12-15 20 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