我有一个应用程序,用户可以使用多种服务登录,例如Google Plus,Facebook,Twitter等.
为了方便这一点,我有一个记录的基础User模型has_many Identity.
Identity记录都有一个provider字段(例如"Google","Facebook"等等),以指示用于登录的提供程序."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 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) 我试图解决我的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) 我是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_id是nil.
如果删除了 …
看似简单,但无法弄清楚如何使其工作.
在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 }
我正在尝试使用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)
我有点不知所措,似乎找不到任何其他人得到同样的错误.
的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) 我们有两个共享相同数据库和模型的Web应用程序.为了保持DRY,我们创建了一个包含所有模型的引擎.此引擎通过Gemfile包含在相应的应用程序中.我们确实在引擎内部使用RSpec和FactoryGirl进行了测试.
现在我们正在尝试编写集成测试,我们希望使用引擎中的工厂而无需复制或符号链接.有没有办法以编程方式实现这一目标?
如果我有这个工厂:
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的特征和忽略块).我希望这是有道理的.我可以在这里显示一堆代码,但我相信这提供了足够的上下文?
我试图将一段条件逻辑放入一个工厂中,该工厂仅在特定特征作为参数传入时才会运行。我在to_create块内,因此可以访问实例和评估器。它们中的任何一个都有返回已传入的特征(如果有)的方法吗?