2011-06-12 45 views
5

在railstutorial,为什么笔者选择使用这个(清单10.25): http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-usersRailstutorial:DB:填充与工厂女孩

namespace :db do 
    desc "Fill database with sample data" 
    task :populate => :environment do 
    Rake::Task['db:reset'].invoke 
    User.create!(:name => "Example User", 
       :email => "[email protected]", 
       :password => "foobar", 
       :password_confirmation => "foobar") 
    99.times do |n| 
     name = Faker::Name.name 
     email = "example-#{n+1}@railstutorial.org" 
     password = "password" 
     User.create!(:name => name, 
        :email => email, 
        :password => password, 
        :password_confirmation => password) 
    end 
    end 
end 

来填充假的用户数据库,并且还(上市7.16) http://ruby.railstutorial.org/chapters/modeling-and-viewing-users-two

Factory.define :user do |user| 
    user.name     "Michael Hartl" 
    user.email     "[email protected]" 
    user.password    "foobar" 
    user.password_confirmation "foobar" 
end 

看来,这两种方式在数据库中正确(不工厂女孩在数据库中创建用户)创建的用户?创建测试用户的两种不同方式的原因是什么?它们有什么不同?一种方法何时比另一种更适合?

回答

8

为了两个不同的目的,在这些例子中使用了Faker和Factory Girl。

使用Faker创建一个rake任务,可以轻松让您填充数据库,通常是开发数据库。这使您可以使用大量填充的假数据浏览您的应用程序。

工厂定义使测试方便写。例如,在您的RSpec测试中,您可以编写:

before(:each) do 
@user = Factory(:user) 
end 

然后@user在随后的测试中可用。它会将这些更改写入测试数据库,但请记住,每次运行测试时都会清除这些更改。

+3

嗯......但为什么他不会在rake任务中使用FactoryGirl,而不是'User.create!'?这不可能吗? – Ajedi32 2012-08-14 20:35:08