标签: factory-bot

rspec,factory_girl和datamapper的spork和cache_classes问题

我有Spork测试服务器的问题.

如果我在config/environments/test.rb中设置config.cache_classes = false,那么规范就会开始出现rasie错误.

Failure/Error: task = Factory(:something, :foo => @foo, :bar => @bar)
     DataMapper::ImmutableError:
       Immutable resource cannot be modified
Run Code Online (Sandbox Code Playgroud)

这是我的spec_helper.rb:

require 'spork'

Spork.prefork do
  if ENV['CODE_COVERAGE'] == '1'
    require 'simplecov'
    SimpleCov.start 'rails'
  end

  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'
  require 'webmock/rspec'
  require 'factory_girl'

  Dir[Rails.root.join("spec/controllers/shared/*.rb")].each { |f| require f }
  Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

  RSpec.configure do |config|
    config.mock_with :mocha
    config.include Rails.application.routes.url_helpers
    config.include UrlHelper

    config.before(:each) do
      repository(:default) do
        transaction = DataMapper::Transaction.new(repository)
        transaction.begin
        repository.adapter.push_transaction(transaction)
      end
    end

    config.after(:each) do …
Run Code Online (Sandbox Code Playgroud)

rspec ruby-on-rails datamapper spork factory-bot

13
推荐指数
2
解决办法
4571
查看次数

factory_girl中的has_many和belongs_to关联

我有这些模型,我正在尝试使用factory_girl创建工厂.

class Foo < ActiveRecord::Base
  belongs_to :baz
end

class Baz < ActiveRecord::Base
  has_many :foos
end
Run Code Online (Sandbox Code Playgroud)

我不知道如何创建工厂而不创建一个工厂无休止地互相呼叫的循环.

Factory.define :foo do |f|
  f.after_create do |ff|
    ff.baz = Factory(:baz)
  end
end

Factory.define :baz do |f|
  f.after_create do |ff|
    ff.foos = [Factory.create(:foo)]
  end
end
Run Code Online (Sandbox Code Playgroud)

我意识到我可以ff.foos = [Factory.create(:foo)]baz工厂里闲逛,但在我的baz测试中,我被迫使用foo.baz而不是仅仅使用baz.我是否被迫在测试中将baz其从foo工厂中取出来使用该对象?或者,还有更好的方法?

ruby unit-testing ruby-on-rails factory-bot

13
推荐指数
1
解决办法
1万
查看次数

在factorygirl中,在初始化field2时以任何方式引用field1的值?

在工厂中,如何引用正在创建的对象中的其他字段之一的值?

假设我的模型Widget有两个字段,nicknamefullname

在我的工厂里面,我想使用Faker在每次创建工厂时创建一个不同的随机昵称.(最后想通了我必须使用sequence(:nickname),否则所有工厂的名称都是一样的.)

为了使一些断言更容易测试,我想生成一个基于昵称的全名,类似于 fullname = "Full name for #{nickname}"

FactoryGirl.define do
  factory :widget do 
    sequence(:nickname) { |n| Faker::Lorem.words(2).join(' ') }
    sequence(:fullname) { |n| "Full name for " + ????? }
  end
end
Run Code Online (Sandbox Code Playgroud)

无论我把它放在哪里??? 去吧,我得到的#<FactoryGirl::Decl...不是昵称所设置的.

我尝试过name,name.to_s,name.value ......似乎没什么用.

ruby-on-rails factory-bot

13
推荐指数
1
解决办法
4863
查看次数

如何使用rspec和工厂女孩创建具有特定id的模型

我用:

gem 'rails', '3.2.11'
gem 'rspec-rails', '2.13.2'
gem 'webrat', '0.7.3'
gem 'factory_girl_rails', '4.1.0'
gem 'spork', '~> 0.9.0.rc'
Run Code Online (Sandbox Code Playgroud)

我想测试我的HP,我总是有一个指向某个用户的链接,因此HP的页面控制器包含:

@user = User.find(7)
Run Code Online (Sandbox Code Playgroud)

惠普的视图包含:

link_to 'See user', @user
Run Code Online (Sandbox Code Playgroud)

问题是所有测试都失败,因为测试数据库没有id为7的用户.我试过:

FactoryGirl.define do
  factory :user do
    name "Testuser"
    id "7"
  end
end
Run Code Online (Sandbox Code Playgroud)

......但这不起作用.始终存在错误:

规格如下:

describe "GET 'home'" do

    before(:each) do
      FactoryGirl.create(:user)
    end

    it "should be successful" do
      get 'home'
      response.should be_success
    end
end
Run Code Online (Sandbox Code Playgroud)

失败/错误:获取'home'ActiveRecord :: RecordNotFound:找不到id = 7的用户

惠普在现实中工作得很好,只是测试失败了.我怎样才能保证这个测试不会失败?

ruby-on-rails rspec2 ruby-on-rails-3 factory-bot

13
推荐指数
2
解决办法
1万
查看次数

如何在FactoryGirl中处理外键

我有一个用户模型和一个跟随者模型,这样用户可以有很多粉丝.因此,在跟随者模型的模式中,我有user_id列和follower_by_user_id列.因此,在跟随者模型中,许多粉丝可以跟随用户.用户ID存储在user_id列中,关注者ID的id存储在follow_by_user_id中.

class User < ActiveRecord::Base
 has_many :followed_users, :class_name => 'Follower', :foreign_key => 'user_id'
 has_many :followers, :class_name => 'Follower', :foreign_key => 'followed_by_user_id'

 validates :email, presence: true, format:{ with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i}

 validates :name,presence:true
end
Run Code Online (Sandbox Code Playgroud)

以上是用户模型

class Follower < ActiveRecord::Base
 belongs_to :user
 belongs_to :followed_by_user, :class_name => 'User', :foreign_key => 'followed_by_user_id'

 validates :user, :followed_by_user, presence:true
 validates_associated :user, :followed_by_user
end
Run Code Online (Sandbox Code Playgroud)

以上是跟随者模型

FactoryGirl.define do 
factory :user do
  name {Faker::Name.name}
  email {Faker::Internet.email}
end 

factory :follower do
  user
  followed_by_user_id
end
Run Code Online (Sandbox Code Playgroud)

followed_by_user_id基本上只是一个用户ID,或者我们可以说user_id是follow_by_user_id列的外键.Im plain English followed_by_user_id是跟随其他用户的用户的id.那么,如果任何正文可以帮助如何在follower工厂中为follower_by_user_id列包含此外键关系?

提前致谢.

ruby-on-rails faker ruby-on-rails-4 factory-bot

13
推荐指数
2
解决办法
6725
查看次数

如何将调试器放入工厂女孩?

你如何调试factory_girl?我试图把调试器放在那里,但我只是不能.我只想测试为什么我的关联不正常

ruby-on-rails-3 factory-bot

12
推荐指数
1
解决办法
3009
查看次数

重新加载factory_girl工厂

我希望当我在工厂中进行更改时,我会在rails控制台中看到它们而不重新启动所有控制台.

我找到了一些线条并对它们进行了测试,对所发生的事情了解不多,文档对我来说并不清楚:

FactoryGirl.reload
Run Code Online (Sandbox Code Playgroud)

我也测试过:

> FactoryGirl.factories.clear
> FactoryGirl.find_definitions # also tested FactoryGirl.factories.find_definitions
                               # but NoMethodError is raised
=> ActiveRecord::RecordNotFound: Couldn't find Address with ID=277 Torphy Squares
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails factory-bot

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

相关工厂的工厂女孩​​唯一性验证失败

我有(简化)工厂定义如下:

factory :league do
  acronym 'NBA'
end

factory :division do
  league
end
Run Code Online (Sandbox Code Playgroud)

分部属于联盟.当我定义这个工厂时,我的假设就是创建一个联盟,并且这个联盟会一次又一次地被重复使用,以使分区成为真正的联盟.

相反,我在第二次通话时遇到错误,FactoryGirl.create(:division)因为联盟acronym应该是独一无二的.

class League < ActiveRecord::Base
  validates :acronym, uniqueness: true
end
Run Code Online (Sandbox Code Playgroud)

在测试中导致以下中断

ActiveRecord :: RecordInvalid:验证失败:已经删除了缩略词

我该如何解决这个问题,最好不要在测试设置中创建层次结构?

如果我想要实现的目标比factory_girl更好,请建议

unit-testing ruby-on-rails factory-bot

12
推荐指数
1
解决办法
2733
查看次数

如何在多个文件中拆分factory_girl定义?

我的factories.rb文件变得太大而无法维护,我现在正试图将其拆分到factories目录中的许多文件中.问题是我不知道如何处理依赖项.

总而言之,我试图以下列方式分割我的工厂.所有序列都转到sequences.rb文件,每个工厂定义都转到单独的文件,如下所示:

工厂/ sequences.rb

FactoryGirl.define do
   sequence :name {|n| "Name #{n}" }
   sequence :email {|n| "person#{n}@example.com" }
end
Run Code Online (Sandbox Code Playgroud)

工厂/ user.rb

FactoryGirl.define do
    factory :user do
        name
        email
    end
end
Run Code Online (Sandbox Code Playgroud)

工厂/ post.rb

FactoryGirl.define do
    factory :post do
        name
        content "Post Content"
        user
    end
end
Run Code Online (Sandbox Code Playgroud)

当我运行测试时,我得到的name是没有定义的错误.我可以通过传递一个块的每个关联(如处理这个name,email,user等)提及,但它似乎是丑陋和不干燥.

  1. 有没有办法factory_girl知道应该加载哪些文件的序列?
  2. 当无法通过更改文件的加载顺序来解决此问题时,处理复杂的依赖关系?

ruby-on-rails factory-bot

12
推荐指数
1
解决办法
930
查看次数

如何避免在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
查看次数