`
clark1231
  • 浏览: 253485 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Factory Girl中的关系定义

阅读更多

 

 

原文在我另外一个博客上,地址: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/

这里直接拷贝过来的,就不在另外排版了。

 

分享到:
评论

相关推荐

    factory_girl:用于将对象设置为与茉莉,摩卡或qunit一起使用的关系数据的库

    从rails的factory_girl移植到nodejs的端口功能 安装 Node.js: npm install 'factory_girl' 用法 定义工厂 var FactoryGirl = require ( 'factory_girl' ) ; // for nodejs FactoryGirl . define ( 'user' , ...

    factory-girl-typeorm:Typeorm适配器,适用于工厂女孩

    1. **安装**: 首先,你需要在项目中安装`factory-girl-typeorm`包,可以通过npm或yarn进行安装: ``` npm install factory-girl-typeorm 或 yarn add factory-girl-typeorm ``` 2. **配置**: 在你的项目中,你...

    factory-lady:受factory_girl启发的用于node.js javascript的工厂库

    要在浏览器或其他JavaScript环境中使用Factory-lady,只需将lib factory-lady.js复制并包含在lib目录下即可。 定义工厂 JavaScript: var Factory = require ( 'factory-lady' ) , User = require ( '../../app/...

    factory_bot:用于将Ruby对象设置为测试数据的库

    从factory_girl过渡? 查看 。 文献资料 您应该在上找到有关版本的文档。 有关定义和使用工厂的信息,请参见 。 我们还提供,可在Upcase上免费获得。 安装 将以下行添加到Gemfile中: gem 'factory_bot' 并从您...

    factory-go:用于设置受factory_bot启发的Golang对象的库

    定义一个简单的工厂 声明工厂具有一组简单属性,并生成一个夹具对象。 package main import ( "fmt" "github.com/bluele/factory-go/factory" ) type User struct { ID int Name string Location string } // ...

    factory_bot_rails:工厂机器人:heart_suit:Rails

    从factory_girl_rails过渡? 查看 。 滑轨 factory_bot_rails提供的Rails集成 。 中列出了受支持的Rails版本。 中列出了受支持的Ruby版本。 下载 GitHub: : 宝石: $ gem install factory_bot_rails 配置 添加...

    factory_bot-preload:像固定装置一样预加载工厂(factory_bot)。 这将很容易,而且可能更快!

    factory_bot-preload 我们都喜欢Rails固定装置,因为它们速度很快,但是我们讨厌处理...将FB和FBP都添加到您的Gemfile中: source "https://rubygems.org" gem "rails" gem "pg" group :test , :development do g

    factory_factory_girl:可以帮助您生成工厂文件的宝石

    然后,您只需要将这些方法复制并粘贴到服务器工厂,甚至服务器项目工厂中的服务器列中即可。 所以我创建了 。 这个宝石的使命是通过一些预定义的规则来帮助人们更快地建立工厂: FactoryFactoryGirl.configure do |...

    rosie:用于构建JavaScript对象的工厂,主要用于设置测试数据。 灵感来自factory_girl

    Factory . define ( 'game' ) . sequence ( 'id' ) . attr ( 'is_over' , false ) . attr ( 'created_at' , ( ) =&gt; new Date ( ) ) . attr ( 'random_seed' , ( ) =&gt; Math . random ( ) ) // Default to two p

    factory_rb:测试 Rails 框架

    `FactoryBot`(之前称为`factory_girl`)简化了测试数据的创建,使测试更简洁、高效。 标题“factory_rb:测试 Rails 框架”指出了这个项目或教程主要关注如何使用`FactoryBot`来测试Rails应用。`FactoryBot`允许...

    设计模式源代码

    不过,我们可以推测这可能涉及到一种模式在特定情境下的实现,比如可能是关于策略模式的,因为“About Girl”可以理解为一个情景或问题,而策略模式就是定义一系列可互换的算法,并将每种算法封装起来,使得它们可以...

    Java的23种设计模式

    设计模式是软件工程领域中的一套被广泛接受的解决方案,这些方案针对软件设计中的常见问题提供了标准答案。Java社区对设计模式的应用尤为重视,将其视为程序员必备的核心技能之一。本文将通过一系列生动的例子来介绍...

    springboot环境集成

    然后,我们需要定义一个Repository接口,继承自SpringData提供的`JpaRepository`。这个接口将自动实现CRUD操作,无需编写任何实现代码: ```java import org.springframework.data.repository.CrudRepository; ...

    java23种设计模式

    示例中的代码展示了简单的工厂模式,`Factory`类根据传入的参数创建`Boy`或`Girl`对象。当需要创建新的对象类型时,只需扩展工厂类即可,无需修改现有的客户端代码。 2. 建造者模式(Builder Pattern): 建造者...

    23种java 设计模式

    外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 **应用场景:** 在复杂的系统中,为了简化外部调用者的操作流程,可以使用外观模式来提供一个...

    ruby on rails 敏捷开发,3.1 pdf and epub format

    另外,测试部分引入了Shoulda和Factory Girl等测试工具,它们可以帮助开发者编写更简洁、更高效的测试用例。 Rails 3.1还引入了CoffeeScript作为默认的JavaScript语言,这是一种语法糖,它可以编译成标准的...

    谈Java的23种设计模式

    在上述例子中,`Factory`类根据传入的参数返回`Boy`或`Girl`对象。这样,客户端代码无需关心具体的对象创建逻辑,只需要与工厂交互即可。 2. 建造者模式(Builder Pattern): 建造者模式将复杂对象的构建与其表示...

    从追MM谈Java的23种设计模式

    在代码示例中,`Factory` 类定义了两个字符串常量 `"boy"` 和 `"girl"`,并提供了一个 `getPeople` 方法用于根据传入的类型创建相应的人(男孩或女孩)对象。这种方式使得添加新的对象类型变得更加容易,只需要扩展...

    Android Koin2基本使用的那件事儿

    factory { Girl() } } ``` 在你的 Activity 或其他组件中,你可以通过 `by inject&lt;T&gt;` 或 `get()` 来获取依赖: ```kotlin class Simple1Activity : AppCompatActivity() { private val girl by inject...

Global site tag (gtag.js) - Google Analytics