标签: factory-bot

构建具有特征的对象列表

我正在使用factory_girl在我的测试中创建对象,这是我工厂的一个例子:

factory :user do
  name "John"
  surname "Doe"

  trait :with_photo do
    ignore do
      photo_count 1
    end

    after(:create) do |user, evaluator|
      FactoryGirl.create_list(:photo, evaluator.photo_count)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

所以我可以创建一个像这样的用户:

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

或者没有照片:

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

或者创建用户列表:

FactoryGirl.build_list(:user, 5)
Run Code Online (Sandbox Code Playgroud)

但是:with_photo,如果我想用照片创建其中五个用户,我如何建立一个具有特征(特质存在)的用户列表?

ruby factory-bot

15
推荐指数
2
解决办法
8360
查看次数

Factory_Girl + RSpec:创建(:用户)时未定义的方法'create'

无法调用"dummy = create(:user)"来创建用户.已经来回走了几个小时.

/home/parreirat/backend-clone/Passworks/spec/models/user_spec.rb:15:in `block (2 levels) in <top (required)>': undefined method `create' for #<Class:0xbcdc1d8> (NoMethodError)"
Run Code Online (Sandbox Code Playgroud)

这是工厂,users.rb:

FactoryGirl.define do

    factory :user do
      email 'heheheheheheh@gmail.com'
      password 'chucknorris'
      name 'luis mendes'
    end

end
Run Code Online (Sandbox Code Playgroud)

这就是我在user_spec.rb中调用FactoryGirl的方式:

require 'spec_helper'

describe 'User system:' do

 context 'registration/login:' do

    it 'should have no users registered initially.' do
      expect(User.count).to eq(0)
    end

    it 'should not be logged on initially.' do
      expect(@current_user).to eq(nil)
    end

    dummy = create(:user)

    it 'should have a single registered user.' do
      expect(User.count).to eq(1)
    end

  end

end
Run Code Online (Sandbox Code Playgroud)

我按照说明将其添加到spec_helper.rb: …

ruby rspec ruby-on-rails factory-bot

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

如何使用rake db:seed将种子数据添加到测试数据库?

我正在使用Factory Girl填充种子数据并将其添加到seed.rb中的数据库中.

我正在使用Cucumber运行我的测试.

我有一个价格表,其中包含我想要在所有环境中使用的种子数据.

我想rake db:seed将它添加到我的dev 测试db和黄瓜能够使用该测试种子.然后我也会在prod中添加种子数据.

如何确保将种子数据添加到dev和test db?

rake db:seed #only adds it only to my dev database
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails cucumber factory-bot

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

Factory Girl/Capybara从数据库测试中删除记录?

与RSpec和Capybara合作,我得到了一个有趣的测试失败模式,它在测试用例中有一些细微的线条重排......这些都不重要.

我正在开发自己的身份验证系统.它目前正在工作,我可以使用浏览器和会话工作等登录/退出.但是,尝试测试这是失败的.正在发生的事情我不太明白,这似乎取决于(看似)不相关的电话的顺序.

require 'spec_helper'

describe "Sessions" do
  it 'allows user to login' do
    #line one
    user = Factory(:user)
    #For SO, this method hashes the input password and saves the record
    user.password! '2468'

    #line two
    visit '/sessions/index'


    fill_in 'Email', :with => user.email
    fill_in 'Password', :with => '2468'
    click_button 'Sign in'

    page.should have_content('Logged in')
  end
end
Run Code Online (Sandbox Code Playgroud)

原样,该测试失败......登录失败.在将'调试器'调用插入规范和控制器后,我可以看到原因:就控制器而言,用户没有插入数据库:

编辑在ApplicationController中添加

class ApplicationController < ActionController::Base
  helper :all
  protect_from_forgery

  helper_method :user_signed_in?, :guest_user?, :current_user

  def user_signed_in?
    !(session[:user_id].nil? || current_user.new_record?)
  end

  def guest_user?
    current_user.new_record?
  end

  def current_user …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails capybara rspec2 rspec-rails factory-bot

14
推荐指数
1
解决办法
3735
查看次数

rspec测试单独传递,但在使用其他测试运行时失败

我有一些用RSpec编写的规范测试各种模型.我使用Factory Girl生成测试对象.

现在最奇怪的事情发生了:
当我运行rspec spec/models/specific_model_spec.rb---这通过了该规范中的所有测试

但是,当我运行时rspec spec/models---此规范中的每个测试都无法引用创建的无效关联(通过工厂)

工厂创建的关联显然是有效的,因为运行测试也是隔离的.

什么可能导致这种行为?

更新:
与其他规范一起运行规范时出现的错误(每个失败的错误相同):

6) StreamItem adds a stream_item to a project and consultant when an engagement is added 
 Failure/Error: @project = Factory.create(:project, :name => 'bar' )
 Validation failed: Customer is invalid
 # ./spec/models/stream_item_spec.rb:44:in `block (2 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)

project factory以另一种规格测试,并通过细...

更新2: 使用的相关工厂代码如下:

Factory.define :manager, :class => User do |f|
  f.sequence(:email) { |n| "bar#{n}@example.com" }
  f.password "pass12"
  f.sequence(:name) { |n| "Erwin#{n}" }
  f.roles_mask 4
end

Factory.define …
Run Code Online (Sandbox Code Playgroud)

rspec ruby-on-rails-3 factory-bot

14
推荐指数
2
解决办法
5387
查看次数

工厂女孩传递参数建模/创建模型定义

车型/ message.rb

class Message

  attr_reader :bundle_id, :order_id, :order_number, :event

  def initialize(message)
    hash = message
    @bundle_id = hash[:payload][:bundle_id]
    @order_id  = hash[:payload][:order_id]
    @order_number = hash[:payload][:order_number]
    @event = hash[:concern]
  end
end
Run Code Online (Sandbox Code Playgroud)

规格/型号/ message_spec.rb

require 'spec_helper'

describe Message do
  it 'should save the payload' do
    payload = {:payload=>{:order_id=>138251, :order_number=>"AW116554416"}, :concern=>"order_create"}
    message = FactoryGirl.build(:message, {:payload=>{:order_id=>138251, :order_number=>"AW116554416"}, :concern=>"order_create"})
    message.event.should == "order_create"
  end
end
Run Code Online (Sandbox Code Playgroud)

error_log中

失败:

1)消息应保存有效负载

 Failure/Error: message = FactoryGirl.build(:message, {:payload=>{:order_id=>138251, :order_number=>"AW116554416"}, :concern=>"order_create"})
 ArgumentError:
   wrong number of arguments (0 for 1)
 # ./app/models/message.rb:4:in `initialize'
 # ./spec/models/message_spec.rb:7:in …
Run Code Online (Sandbox Code Playgroud)

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

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

如何与工厂女孩一起创建独特的字符串(没有数字)?

或者是生成随机和唯一用户名所必需的外部gem?

这是我目前的工厂:

factory :user_4 do
    sequence(:id) { |n| n }
    sequence(:first_name) { |n| "Gemini" + n.to_s }
    sequence(:last_name) { |n| "Pollux" + n.to_s }
    sequence(:profile_name) { |n| "GeminiPollux" + n.to_s  }
    sequence(:email) { |n| "geminipollus" + n.to_s + "@hotmail.co.uk" }
end
Run Code Online (Sandbox Code Playgroud)

使用序列方法适用于id,profile_name和email,但我的REGEX验证意味着名字和姓氏自动无效,因为它们中有一个数字.与独特性无关.

那么我该如何创建这些独特的名字呢?

ruby ruby-on-rails factory-bot

14
推荐指数
2
解决办法
6726
查看次数

Rspec/FactoryGirl:清理数据库状态

我是Rspec和Factory女孩的新手,希望我的测试能够在特定的数据库状态下运行.我知道我可以让Factory girl创建这些记录,并且在测试运行后对象将被销毁,但是如果我在数据库中有数据会发生什么.

例如:我希望我的测试在我通过Factory Girl创建的数据库中有3条记录时运行.但是,我目前在数据库中已有1个模型记录,我不想仅为测试删除它.那里有一个模型毁了我的测试.

数据库内容

[#<Leaderboard id: 1, score: 500, name: "Trudy">]
Run Code Online (Sandbox Code Playgroud)

leaderboard_spec.rb

require 'spec_helper'

describe Rom::Leaderboard do

    describe "poll leaderboard" do
        it "should say 'Successful Run' when it returns" do
            FactoryGirl.create(:leaderboard, score: 400, name: "Alice")
            FactoryGirl.create(:leaderboard, score: 300, name: "Bob")
            FactoryGirl.create(:leaderboard, score: 200, name: "John")
            Leaderboard.highest_scorer.name.should == "Alice"
        end
    end

end
Run Code Online (Sandbox Code Playgroud)

现在我的测试将失败,因为它会错误地认为Trudy是最高得分手,因为测试运行的状态不正确.

工厂女孩是否提供从数据库中删除记录然后回滚此删除?类似于它在数据库中创建记录和回滚的方式

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

14
推荐指数
1
解决办法
9986
查看次数

在factory_girl中使用params从另一个特征中调用特征

我有一个相当厚实的工厂女孩​​特质,接受参数并创建一个has_many关系.我可以将这种特性称为另一种特性的一部分,以便将特性干涸或者在将它们传递给工厂时更容易将特征捆绑在一起.我不知道怎么做的是当我从另一个特征中调用它时,或者该怎样做时,如何将params传递给一个特征.

例如

FactoryGirl.define do
  factory :currency do
    name Forgery::Currency.description
    sequence(:short_name) { |sn| "#{Forgery::Currency.code}#{sn}" }
    symbol '$'
  end

  factory :price do
    full_price { 6000 }
    discount_price { 3000 }
    currency
    subscription
  end

  sequence(:base_name) { |sn| "subscription_#{sn}" }

  factory :product do
    name { generate(:base_name) }
    type { "reading" }
    duration { 14 }


    trait :reading do
      type { "reading subscription" }
    end

    trait :maths do
      type { "maths subscription" }
    end

    trait :six_month do
      name { "six_month_" + generate(:base_name) }
      duration { …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails factory-bot

14
推荐指数
2
解决办法
3256
查看次数

什么是factory_girl瞬态属性?我为什么要用一个?

我从Thoughtbot 读到这个,但它仍然让我感到困惑.

这是他们的例子:

factory :user do
  transient do
    rockstar true
    upcased  false
  end

  name  { "John Doe#{" - Rockstar" if rockstar}" }
  email { "#{name.downcase}@example.com" }

  after(:create) do |user, evaluator|
    user.name.upcase! if evaluator.upcased
  end
end

create(:user, upcased: true).name
#=> "JOHN DOE - ROCKSTAR"
Run Code Online (Sandbox Code Playgroud)

所以,

  1. .upcased模型的真正属性吗?
  2. 什么是transient块真正在做什么?设置可以在工厂中使用的变量?
  3. 什么是evaluator?它总是需要最后传递吗?如果您的create函数使用特征,瞬态并具有多个值,该怎么办?

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

14
推荐指数
1
解决办法
2513
查看次数