标签: factory-bot

如何避免在factory_girl中循环创建关联模型?

我有一个应用程序,用户可以使用多种服务登录,例如Google Plus,Facebook,Twitter等.

为了方便这一点,我有一个记录的基础User模型has_many Identity.

  • 每个Identity记录都有一个provider字段(例如"Google","Facebook"等等),以指示用于登录的提供程序.
  • 有一个ActiveRecord验证,只允许用户拥有每种类型的提供者.所以用户不能拥有2 "Google" identities.

我按如下方式设置工厂:

FactoryGirl.define do
  factory :user do
    sequence(:name) { |n| "Julio Jones-#{n}"}
    sequence(:email) { |n| "julio.jones-#{n}@atl.com" }

    after(:create) do |user|
      create(:identity, user: user)
    end
  end

  factory :identity do
    user

    provider "Google"
    email { user.email }
    password "password"
  end
end
Run Code Online (Sandbox Code Playgroud)

User模型具有创建Identity记录的回调.它运行时效果很好

user = FactoryGirl.create(:user)
Run Code Online (Sandbox Code Playgroud)

但是,如果我创造identity,而不是

identity = FactoryGirl.create(:identity)
Run Code Online (Sandbox Code Playgroud)

identity工厂将首先尝试创建父user,这将反过来创建另一个identity.当它最终回到创建 …

ruby rspec ruby-on-rails factory-bot

12
推荐指数
2
解决办法
1421
查看次数

FactoryGirl关联模型故障:"SystemStackError:堆栈级别太深"

我正在使用Ruby on Rails 3.0.9,RSpec-rails 2和FactoryGirl.我试图陈述一个工厂协会模型,但我遇到了麻烦.

我有一个factories/user.rb如下文件:

FactoryGirl.define do
  factory :user, :class => User do
    attribute_1
    attribute_2
    ...

    association :account, :factory => :users_account, :method => :build, :email => 'foo@bar.com'
  end
end
Run Code Online (Sandbox Code Playgroud)

和以下factories/users/account.rb文件:

FactoryGirl.define do
  factory :users_account, :class => Users::Account do
    sequence(:email) {|n| "foo#{n}@bar.com" }
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

上面的示例在我的spec文件中按预期工作,但如果factory :users_account语句中我添加了association :user代码,那么

FactoryGirl.define do
  factory :users_account, :class => Users::Account do
    sequence(:email) {|n| "foo#{n}@bar.com" }
    ...
    association      :user
  end
end
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Failure/Error: Unable to …
Run Code Online (Sandbox Code Playgroud)

ruby rspec ruby-on-rails ruby-on-rails-3 factory-bot

11
推荐指数
1
解决办法
4650
查看次数

RSPEC和工厂女孩SystemStackError:堆栈级别太深

我试图解决我的Spec测试的问题,我得到以下错误失败:

  1) SessionsController POST 'create' with valid email and password should sign in the user
     Failure/Error: Unable to find matching line from backtrace
     SystemStackError:
       stack level too deep
     # /Users/Aurelien/.rvm/gems/ruby-1.9.2-p290@rails3/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract/connection_specification.rb:103

Finished in 37.77 seconds
9 examples, 1 failure

Failed examples:

rspec ./spec/controllers/sessions_controller_spec.rb:35 # SessionsController POST 'create' with valid email and password should sign in the user
Run Code Online (Sandbox Code Playgroud)

在此之前,我与工厂的关联存在问题.

Factory.define :role do |role|
  role.name                   "Registered"
  role.association :user, :factory => :user
end

Factory.define :admin do |role|
  role.name                   "Admin"
  role.association :user, :factory => :user …
Run Code Online (Sandbox Code Playgroud)

factory rspec ruby-on-rails factory-bot

11
推荐指数
1
解决办法
7266
查看次数

Factory Girl创建与现有对象的关联

我是FactoryGirl的新手,我正在尝试以下简单方案?

factory :female, :class => Gender do
  code 'Female'
end

factory :male, :class => Gender do
  code 'Male'
end

factory :papas, :class => Customer do
  first_name 'Jim'
  last_name 'Papas'
  association :gender, :factory => :male, :strategy => :build
end

factory :dumas, :class => Customer do
  first_name 'Mary'
  last_name 'Dumas'
  association :gender, :factory => :female, :strategy => :build
end
Run Code Online (Sandbox Code Playgroud)

然后在我的测试中:

 create(:male)
 create(:female)
 create(:papas)
 create(:dumas)
Run Code Online (Sandbox Code Playgroud)

请注意,Customer类具有关联belongs_to Gender类和验证规则,该规则gender_id应该存在.我还对Gender类的唯一性进行了验证.

create(:papas)上面的声明中,在我的测试中,我得到了Customer将要创建的错误无效的错误,因为gender_idnil.

如果删除了 …

ruby-on-rails associations factory-bot

11
推荐指数
3
解决办法
8009
查看次数

如何使用FactoryGirl与在initialize方法中采用哈希的模型?

看似简单,但无法弄清楚如何使其工作.

在model.rb中:

def Model
  attr_accessor :width,
                :height

  def initialize params
    @width = params[:width]
    @height = params[:height]
    ...
Run Code Online (Sandbox Code Playgroud)

在工厂文件中models.rb:

FactoryGirl.define do
  factory :model do
    height 5
    width 7
  end
end
Run Code Online (Sandbox Code Playgroud)

在工厂方法中设置属性会引发错误 wrong number of arguments (0 for 1)

在没有Rails的情况下使用Ruby 1.9.3,使用Factory.build.FactoryGirl 4.1.

编辑:更多信息:

使用RSpec: let(:model) { FactoryGirl.build :model }

ruby rspec initialization factory-bot

11
推荐指数
1
解决办法
4827
查看次数

使用FactoryGirl的未定义方法after_create

我正在尝试使用after_create回调在FactoryGirl中定义一个has_many关系,就像在/spec/factories/emails.rb中一样:

FactoryGirl.define do
    factory :email do
        after_create do |email|
            email.attachments << FactoryGirl.build(:attachment)
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

附件在单独的工厂/spec/factories/attachment.rb中定义:

FactoryGirl.define do
    factory :attachment do
        # Attach the file to paperclip
        file { fixture_file_upload(Rails.root.join('spec', 'support', 'myimage.png'), 'image/png') }
    end
end
Run Code Online (Sandbox Code Playgroud)

在我的规范中使用:附件工作非常好,所以我确信工厂不是问题,但是当我尝试创建一个:来自工厂的电子邮件时,我得到以下异常抛出:

Failure/Error: email = FactoryGirl.create(:email)
    NoMethodError:
        undefined method `after_create=' for #<Email:0x007ff0943eb8e0>
Run Code Online (Sandbox Code Playgroud)

我有点不知所措,似乎找不到任何其他人得到同样的错误.

rspec ruby-on-rails-3 factory-bot

11
推荐指数
1
解决办法
4465
查看次数

如何使用Minitest测试Pundit策略?

的Gemfile

gem 'pundit', '~> 0.2.1'
Run Code Online (Sandbox Code Playgroud)

应用程序/控制器/ application_controller.rb

class ApplicationController < ActionController::Base

  include Pundit
  ...
Run Code Online (Sandbox Code Playgroud)

应用程序/政策/ application_policy.rb

class ApplicationPolicy < Struct.new(:user, :record)
  def index?  ; false;                              end
  def show?   ; scope.where(id: record.id).exists?; end
  def create? ; false;                              end
  def new?    ; create?;                            end
  def update? ; false;                              end
  def edit?   ; update?;                            end
  def destroy?; false;                              end
  def scope
    Pundit.policy_scope!(user, record.class)
  end
end
Run Code Online (Sandbox Code Playgroud)

应用程序/政策/ book_policy.rb

class BookPolicy < ApplicationPolicy

  def create?
    record.new_record?
  end

  def new?
    create?      end

  def show?
    record.published? || …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails minitest ruby-on-rails-4 pundit factory-bot

11
推荐指数
2
解决办法
3030
查看次数

如何从引擎中使用FactoryGirl工厂

我们有两个共享相同数据库和模型的Web应用程序.为了保持DRY,我们创建了一个包含所有模型的引擎.此引擎通过Gemfile包含在相应的应用程序中.我们确实在引擎内部使用RSpec和FactoryGirl进行了测试.

现在我们正在尝试编写集成测试,我们希望使用引擎中的工厂而无需复制或符号链接.有没有办法以编程方式实现这一目标?

rspec ruby-on-rails factory-bot

11
推荐指数
1
解决办法
1832
查看次数

FactoryGirl create_list传递多个值

如果我有这个工厂:

factory :product, class: Product do
  name        { Faker::Commerce.product_name }
  description { Faker::Lorem.paragraph }
  price       { Faker::Number.number(3) }
end
Run Code Online (Sandbox Code Playgroud)

我可以create_list用来创建这样的2个产品:

FactoryGirl.create_list(:product, 2)
Run Code Online (Sandbox Code Playgroud)

但我想将默认值传递给我的两个产品,我认为理论上会有这样的东西?:

prods = [{:name => "Product 1"},{:name => "Product 2"}]
FactoryGirl.create_list(:product, prods.count, prods)
Run Code Online (Sandbox Code Playgroud)

我已经搜索了一段时间而无法找到答案,是否可以使用优雅的解决方案create_list

我想要这个解决方案的原因是因为:product是父模型的许多子关联之一.我想要一种可配置的方式,我可以通过一个FactoryGirl.create命令生成父模型工厂,并传递我想要的子关联的所有值(通过使用FactoryGirl的特征和忽略块).我希望这是有道理的.我可以在这里显示一堆代码,但我相信这提供了足够的上下文?

ruby factory-bot

11
推荐指数
2
解决办法
5016
查看次数

FactoryBot:检查特征是否已传入

我试图将一段条件逻辑放入一个工厂中,该工厂仅在特定特征作为参数传入时才会运行。我在to_create块内,因此可以访问实例和评估器。它们中的任何一个都有返回已传入的特征(如果有)的方法吗?

factory-bot

11
推荐指数
0
解决办法
553
查看次数