我有一个标准的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为你的工厂添加关系,但如果有一个很好的方法,我想解决这个问题.
提前致谢.
与此处描述的问题类似: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清除数据库,因此不会抛出重复的条目错误吗?
我正在使用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) 我一直在努力掌握编写测试的方法,但是由于测试似乎永远无法验证我想要的方式,因此我遇到了很多麻烦.特别是,我一直在尝试使用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 = …
在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) 我对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.我在哪里设置类定义?我需要设置工厂助手吗?
我工作FactoryGirl在version 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工作?
我正在尝试在上传图片时测试我的用户是否有照片值.它在浏览器中工作正常,测试的基本功能通过,但如果我试图断言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)
有没有办法确保控制器实际上在数据库中保存了照片值?它只是模型的一个属性,它将文件名保存为字符串.
使用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.谢谢!!
我有一个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
factory-bot ×10
rspec ×4
ruby ×2
activerecord ×1
carrierwave ×1
fixtures ×1
mocking ×1
rspec-rails ×1
rspec2 ×1
unit-testing ×1
uploader ×1