原文在我另外一个博客上,地址:http://caok1231.com/blog/2013/05/02/factory-girl/
这里直接拷贝过来的,就不在另外排版了。
很多时候我们都会使用 factory-girl 去构建测试数据,但如何去定义表之间的关系,特别是那种用户角色、权限之类的,接下来就稍微总结下如何用factory girl 去定义测试数据中的用户角色。
1.Many-to-Many
假定用户角色是通过many-to-many的关系定义的,比如结构是如下定义的:
class User < ActiveRecord::Base
has_many :user_roles
has_many :roles, :through => :user_roles
end
class UserRole < ActiveRecord::Base
belongs_to :user
belongs_to :role
end
class Role < ActiveRecord::Base
attr_accessible :name
has_many :user_roles
has_many :users, :through => :user_roles
end
1.1通过seeds.rb
先介绍下一种简单的处理,通过加载seeds.rb,预先生成“role”
seeds.rb
Role.delete_all
Role.create!([{ name: 'admin' }, { name: 'member' }])
在spec_helper.rb中将其加载
spec_helper.rb
RSpec.configure do |config|
.....
config.before(:all) do
DatabaseCleaner.start
# execute seed.rb
load File.expand_path('db/seeds.rb', Rails.root)
end
.....
end
介绍两种调用方式:
第一种:
factory :user do
name "xxx"
trait :admin do
after(:build) {|u| u.roles << Role.find_by_name('admin') }
end
end
//测试中创建admin角色的user
create :user, :admin
另外一种:
factory :user do
name "xxx"
trait :admin do
after(:build) {|u| u.roles << Role.find_by_name('admin') }
end
factory :admin, traits: [:admin]
end
//测试中创建admin角色的user
create :admin
Traits 允许你组合属性,然后将它们应用到任何 factory 中。
1.2直接构建 many-to-many
上面的方法有些讨巧,实际上这个就是要解决如何通过 factory-girl 去构建 many-to-many 的关系
factory :user do
name "xxx"
factory :admin_user do
roles {[ create(:admin_role) ]}
end
factory :member_user do
roles {[ create(:member_role) ]}
end
end
factory :role do
factory :admin_role do
name "admin"
end
factory :member_role do
name "member"
end
end
//测试中创建admin角色的user
create :admin_user
2.has-many
factory :article do
body 'article body'
factory :article_with_comment do
after(:create) do |article|
create(:comment, article: article)
end
end
end
factory :comment do
body 'Great article!'
end
// 调用
article = create(:article_with_comment)
更多的比如多态之类的关系可以参考Factory Girl callbacks
3.补充
定义角色还有种更常见的方式,就是通过 Role Based Authorization 这样去定义用户角色的,可以这么处理
FactoryGirl.define do
factory :user do
name "xxx"
.....
# create role user for all roles
#
# trait :admin do
# roles ["admin"]
# end
#
# factory :admin_user, :traits => [:admin]
User::ROLES.each do |r|
trait r do
roles r
end
factory "#{r}_user", :traits => [r]
end
end
end
调用时直接这样来:
create :admin_user
原文在我另外一个博客上,地址:http://caok1231.com/blog/2013/05/02/factory-girl/
这里直接拷贝过来的,就不在另外排版了。
相关推荐
从rails的factory_girl移植到nodejs的端口功能 安装 Node.js: npm install 'factory_girl' 用法 定义工厂 var FactoryGirl = require ( 'factory_girl' ) ; // for nodejs FactoryGirl . define ( 'user' , ...
要在浏览器或其他JavaScript环境中使用Factory-lady,只需将lib factory-lady.js复制并包含在lib目录下即可。 定义工厂 JavaScript: var Factory = require ( 'factory-lady' ) , User = require ( '../../app/...
从factory_girl过渡? 查看 。 文献资料 您应该在上找到有关版本的文档。 有关定义和使用工厂的信息,请参见 。 我们还提供,可在Upcase上免费获得。 安装 将以下行添加到Gemfile中: gem 'factory_bot' 并从您...
定义一个简单的工厂 声明工厂具有一组简单属性,并生成一个夹具对象。 package main import ( "fmt" "github.com/bluele/factory-go/factory" ) type User struct { ID int Name string Location string } // ...
从factory_girl_rails过渡? 查看 。 滑轨 factory_bot_rails提供的Rails集成 。 中列出了受支持的Rails版本。 中列出了受支持的Ruby版本。 下载 GitHub: : 宝石: $ gem install factory_bot_rails 配置 添加...
factory_bot-preload 我们都喜欢Rails固定装置,因为它们速度很快,但是我们讨厌处理...将FB和FBP都添加到您的Gemfile中: source "https://rubygems.org" gem "rails" gem "pg" group :test , :development do g
然后,您只需要将这些方法复制并粘贴到服务器工厂,甚至服务器项目工厂中的服务器列中即可。 所以我创建了 。 这个宝石的使命是通过一些预定义的规则来帮助人们更快地建立工厂: FactoryFactoryGirl.configure do |...
Factory . define ( 'game' ) . sequence ( 'id' ) . attr ( 'is_over' , false ) . attr ( 'created_at' , ( ) => new Date ( ) ) . attr ( 'random_seed' , ( ) => Math . random ( ) ) // Default to two p
4) XML没有定义任何标记,它提供了一种工具定义标记以及它们之间的结构关系; 5) XML是一种用于结构化文本交换的标记语言; 6) XML代表了内容的结构也代表了内容本身; 7) XML继承自SGML(标准通用标记语言)。SGML的...
与 factory_girl 类似,它支持多种构建策略(build()、attributes() 和 create())、序列和特征,以涵盖生成测试数据的典型要求。 安装 节点.js: npm install node-factories 简单的工厂 用户的简单定义: var...
NodeJS amazinGenerator Description(说明): Powerfull项目,具有可以作为基础的一些功能,该项目具有基于项目的发电机的某些结构。 也有一些基于项目的配置文件。 此项目可帮助开发人员在Scrum... :在JS文件中编