原文在我另外一个博客上,地址: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' , ...
1. **安装**: 首先,你需要在项目中安装`factory-girl-typeorm`包,可以通过npm或yarn进行安装: ``` npm install factory-girl-typeorm 或 yarn add factory-girl-typeorm ``` 2. **配置**: 在你的项目中,你...
要在浏览器或其他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
`FactoryBot`(之前称为`factory_girl`)简化了测试数据的创建,使测试更简洁、高效。 标题“factory_rb:测试 Rails 框架”指出了这个项目或教程主要关注如何使用`FactoryBot`来测试Rails应用。`FactoryBot`允许...
不过,我们可以推测这可能涉及到一种模式在特定情境下的实现,比如可能是关于策略模式的,因为“About Girl”可以理解为一个情景或问题,而策略模式就是定义一系列可互换的算法,并将每种算法封装起来,使得它们可以...
设计模式是软件工程领域中的一套被广泛接受的解决方案,这些方案针对软件设计中的常见问题提供了标准答案。Java社区对设计模式的应用尤为重视,将其视为程序员必备的核心技能之一。本文将通过一系列生动的例子来介绍...
然后,我们需要定义一个Repository接口,继承自SpringData提供的`JpaRepository`。这个接口将自动实现CRUD操作,无需编写任何实现代码: ```java import org.springframework.data.repository.CrudRepository; ...
示例中的代码展示了简单的工厂模式,`Factory`类根据传入的参数创建`Boy`或`Girl`对象。当需要创建新的对象类型时,只需扩展工厂类即可,无需修改现有的客户端代码。 2. 建造者模式(Builder Pattern): 建造者...
外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 **应用场景:** 在复杂的系统中,为了简化外部调用者的操作流程,可以使用外观模式来提供一个...
另外,测试部分引入了Shoulda和Factory Girl等测试工具,它们可以帮助开发者编写更简洁、更高效的测试用例。 Rails 3.1还引入了CoffeeScript作为默认的JavaScript语言,这是一种语法糖,它可以编译成标准的...
在上述例子中,`Factory`类根据传入的参数返回`Boy`或`Girl`对象。这样,客户端代码无需关心具体的对象创建逻辑,只需要与工厂交互即可。 2. 建造者模式(Builder Pattern): 建造者模式将复杂对象的构建与其表示...
在代码示例中,`Factory` 类定义了两个字符串常量 `"boy"` 和 `"girl"`,并提供了一个 `getPeople` 方法用于根据传入的类型创建相应的人(男孩或女孩)对象。这种方式使得添加新的对象类型变得更加容易,只需要扩展...
factory { Girl() } } ``` 在你的 Activity 或其他组件中,你可以通过 `by inject<T>` 或 `get()` 来获取依赖: ```kotlin class Simple1Activity : AppCompatActivity() { private val girl by inject...