标签: factory-bot

FactoryGirl与验证有很多联系

我有一个标准的has_many关系(预订有很多订单),验证如果没有至少一个订单,预订不会得到保存.我正试图用FactoryGirl工厂复制这个,但验证阻止我这样做.

class Booking < ActiveRecord::Base
  has_many :orders
  validates :orders, presence: true
end

class Order < ActiveRecord::Base
  belongs_to :booking
end
Run Code Online (Sandbox Code Playgroud)

以下是FactoryGirl的GitHub维基页面中每个型号的FactoyGirl工厂规格.

FactoryGirl.define do                                                    

  factory :booking do                                                                                                                   
    factory :booking_with_orders do

      ignore do                                                                                                                         
        orders_count 1                                                                                                                  
      end                                                                                                                               

      before(:create) do |booking, evaluator|                                                                                           
        FactoryGirl.create_list(:order, evaluator.orders_count, booking: booking)                                                       
      end                                                                                                                               
    end                                                                                                                                 
  end 

  factory :order do
    booking
  end

end 
Run Code Online (Sandbox Code Playgroud)

当我尝试FactoryGirl.create(:booking_with_orders)从我的规范运行时,我得到:

Failure/Error: @booking = FactoryGirl.create(:booking_with_orders)
ActiveRecord::RecordInvalid:
  Validation failed: Orders can't be blank
Run Code Online (Sandbox Code Playgroud)

似乎验证的检查正在运行,甚至在before(:create) [...]此之前理论上会创建预订的订单.

这篇文章建议不要has_many为你的工厂添加关系,但如果有一个很好的方法,我想解决这个问题.

提前致谢.

ruby-on-rails factory-bot

19
推荐指数
1
解决办法
4866
查看次数

在每个示例之后,factory_girl + rspec似乎没有回滚更改

与此处描述的问题类似:http: //rpheath.com/posts/411-how-to-use-factory-girl-with-rspec

简而言之(缩短代码):

spec_helper:

config.use_transactional_fixtures = true
config.use_instantiated_fixtures  = false
Run Code Online (Sandbox Code Playgroud)

factories.rb:

Factory.define :state do
  f.name "NY"
end
Run Code Online (Sandbox Code Playgroud)

在我的规格中

before(:each) do 
  @static_model = Factory(:state) # with validate uniqueness of state name
end
Run Code Online (Sandbox Code Playgroud)

错误:

重复的条目名称"NY"等.


问题:在每个规范示例之前,不应该rspec清除数据库,因此不会抛出重复的条目错误吗?

ruby rspec ruby-on-rails fixtures factory-bot

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

Factory Girl:如何在不创建新记录的情况下将记录与另一条记录相关联?

我正在使用Factory Girl/Rspec2/Rails 3.

factories.rb,我有:

Factory.define :user do |user|
  user.name       'Some guy'
  user.email      'some_guy@somewhere.org'
  user.password   'password'
end

Factory.define :org_admin, :parent => :user do |user|
  user.email 'org_admin@somehwere.org'
end

Factory.define :user_with_membership_request, :parent => :user do |user|
  user.email 'user_with_membership_request@somehwere.org'
end

Factory.define :organization do |org|
  org.name        'MEC'
  org.description 'Mountain Equipment Co-op'
end

Factory.define :membership do |membership|
  membership.user { Factory(:user) }
  membership.organization { Factory(:organization) }
end

Factory.define :admin_membership, :parent => :membership do |membership|
  membership.user { Factory(:org_admin) }
  membership.is_admin true
  membership.status 'active'
end

Factory.define :membership_request, …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rspec2 factory-bot

18
推荐指数
1
解决办法
4783
查看次数

工厂女孩未通过Rspec验证测试

我一直在努力掌握编写测试的方法,但是由于测试似乎永远无法验证我想要的方式,因此我遇到了很多麻烦.特别是,我一直在尝试使用Factory Girl而不是固定装置 - 正如我最近在网上看到的Railscasts和其他建议所示 - 由于它所宣称的好处,而且还没有成功.

例如,这是一个用户模型的简单Rspec测试,测试以确保存在用户名...

describe User do
  it "should not be valid without a username" do
    user = FactoryGirl.create(:user, :username => "", :password => "secret")
    user.should_not be_valid
  end
end
Run Code Online (Sandbox Code Playgroud)

和我的factories.rb文件,如果它有帮助...

FactoryGirl.define do
  factory :user do
    sequence(:username) { |n| "registered-#{n}" }
    password "foobar"
  end
end
Run Code Online (Sandbox Code Playgroud)

当我运行'rake spec'时,它告诉我......

1) User should not be valid without a username
     Failure/Error: user = FactoryGirl.create(:user, :username => "", :password => "secret")
     ActiveRecord::RecordInvalid:
       Validation failed: Username can't be blank
Run Code Online (Sandbox Code Playgroud)

嗯......这就是POINT.如果我指定用户不应该有效,那么这个测试真的不应该通过吗?

如果我更换了Factory Girl系列并在测试中设置了类似的用户'user = …

rspec ruby-on-rails factory-bot

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

如何使用工厂女孩创建具有has_many的关联列表,并在创建时使用验证

在Rails应用程序中,给出了三个模型User,Article和Reviewer,它们具有以下关系和验证:

class User < ActiveRecord::Base
  has_many :articles
  has_many :reviewers
end

class Reviewer < ActiveRecord::Base
  belongs_to :user
  belongs_to :article
end

class Article < ActiveRecord::Base
  belongs_to :user
  has_many :reviewers

  validate :has_reviewers?

  def has_reviewers?
    errors.add(:base, "article must have at least one reviewer.") if self.reviewers.blank?
  end
end
Run Code Online (Sandbox Code Playgroud)

以下工厂使用较新的DSL:

FactoryGirl.define do

  factory :user do
    name { (8...20).map{ ('a'..'z').to_a[rand(26)] }.join }
    age  { Kernel.rand(100) }
  end

  factory :article do
    body "This is the article content"
    title "This is the title"
    user
    after_create do |article|
      article.reviewers = …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails-3 factory-bot

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

为模块内的类定义工厂

我对factory_girl很新,我有以下问题.

我有一个班级说的形式:

class Fruit::Apple < ActiveRecord::Base
  ...
end
Run Code Online (Sandbox Code Playgroud)

假设我需要为这个类创建工厂.我该怎么办?换句话说,工厂有一个set_fixture_class等价物吗?

我的apple_factory.rb如下:

FactoryGirl.define do |f|
  factory 'apple' do
    variety : washington
  end
end
Run Code Online (Sandbox Code Playgroud)

我有所有必需的宝石,我的文件夹结构是形式test/factory/apple_factory.rb.当我执行我的测试时,我得到了uninitialized constant Apple.我在哪里设置类定义?我需要设置工厂助手吗?

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

18
推荐指数
1
解决办法
4169
查看次数

FactoryGirl瞬态变量的未定义方法

我工作FactoryGirlversion 4.4.我正在尝试创建after(:create)回调,但我在评估变量上失败了.

FactoryGirl.define do
  factory :organization do

    name 'example'

    factory :organization_with_links do

      transient do
        links_count 5
      end

      after(:create) do |organization, evaluator|
        create_list(:link, evaluator.links_count, organization: organization)
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

不幸的是我得到了

NoMethodError: undefined method `links_count' for  FactoryGirl::SyntaxRunner:0x007fcefb1ff780>
Run Code Online (Sandbox Code Playgroud)

根据官方工厂女孩指南我正在做的一切正确:https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#associations

任何建议如何transient variable工作?

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

18
推荐指数
1
解决办法
4111
查看次数

如何测试文件是否在控制器中上传?

我正在尝试在上传图片时测试我的用户是否有照片值.它在浏览器中工作正常,测试的基本功能通过,但如果我试图断言user.photo不是nil,它就会失败.这是测试

describe 'POST #update' do
  context 'when there is an image' do
    it 'renders the crop template' do
      login(user)
      photo = File.open(File.join(Rails.root, '/spec/fixtures/images/bob-weir.jpg'))
      post :update, user: { photo: photo }

      expect(response).to render_template('crop')
      user.reload
      expect(user.photo.file).to_not be_nil
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

正在生产:

Failure/Error: expect(user.photo.file).to_not be_nil
       expected: not nil
            got: nil
Run Code Online (Sandbox Code Playgroud)

如果我在测试结束时调试器并执行user.photo,我会得到:

(byebug) user.photo

#<PhotoUploader:0x007fa447029480 @model=#<User id: 226, ..... photo: nil>,
@mounted_as=:photo, @storage=#<CarrierWave::Storage::File:0x007fa4468ddbb8 
@uploader=#<PhotoUploader:0x007fa447029480 ...>>>
Run Code Online (Sandbox Code Playgroud)

有没有办法确保控制器实际上在数据库中保存了照片值?它只是模型的一个属性,它将文件名保存为字符串.

rspec uploader carrierwave ruby-on-rails-4 factory-bot

18
推荐指数
1
解决办法
7834
查看次数

Ruby Gem:未初始化的常量FactoryBot

使用Ruby gem并尝试在RSpec中使用FactoryBot.

我有这个support/factory_bot.rb:

RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods

  config.before(:suite) do
    FactoryBot.find_definitions
  end
end
Run Code Online (Sandbox Code Playgroud)

并在spec_helper.rb:

require 'support/factory_bot'
Run Code Online (Sandbox Code Playgroud)

当我尝试运行spec rake任务时,我收到此错误:

support/factory_bot.rb:2:in `block in <top (required)>': uninitialized constant FactoryBot (NameError)
Run Code Online (Sandbox Code Playgroud)

我错过了什么?当我使用旧的factory_girl gem时,这常常工作正常,但它已经打破了重命名为factory_bot.谢谢!!

ruby factory-bot

18
推荐指数
2
解决办法
9861
查看次数

如何使用factory_girl模拟和存储活动记录before_create回调

我有一个ActiveRecord模型,PricePackage.这有一个before_create回调.此回调使用第三方API进行远程连接.我正在使用工厂女孩,并希望将这个api存根,以便在测试期间建立新工厂时不会进行远程调用.

我正在使用Rspec进行模拟和存根.我遇到的问题是我的工厂中没有Rspec方法.rb

模型:

class PricePackage < ActiveRecord::Base
    has_many :users
    before_create :register_with_3rdparty

    attr_accessible :price, :price_in_dollars, :price_in_cents, :title


    def register_with_3rdparty
      return true if self.price.nil?

        begin
          3rdPartyClass::Plan.create(
            :amount => self.price_in_cents,
            :interval => 'month',
            :name => "#{::Rails.env} Item #{self.title}",
            :currency => 'usd',
            :id => self.title)
        rescue Exception => ex
          puts "stripe exception #{self.title} #{ex}, using existing price"
          plan = 3rdPartyClass::Plan.retrieve(self.title)
          self.price_in_cents = plan.amount
          return true
        end
    end
Run Code Online (Sandbox Code Playgroud)

厂:

#PricePackage
Factory.define :price_package do |f|
  f.title "test_package"
  f.price_in_cents "500"
  f.max_domains "20"
  f.max_users "4"
  f.max_apps "10"
  f.after_build …
Run Code Online (Sandbox Code Playgroud)

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

17
推荐指数
1
解决办法
6293
查看次数