当我可以使用before(:each)块时,工厂女孩在rspec测试中的目的是什么?感觉就像Factory Girl和a之间的唯一区别before(:each)是工厂在测试之外准备对象创建.这是正确的吗?
我有一个属于一个组的用户模型.组必须具有唯一的名称属性.用户工厂和组工厂定义为:
Factory.define :user do |f|
f.association :group, :factory => :group
# ...
end
Factory.define :group do |f|
f.name "default"
end
Run Code Online (Sandbox Code Playgroud)
创建第一个用户时,也会创建一个新组.当我尝试创建第二个用户时,它失败了,因为它想要再次创建相同的组.
有没有办法告诉factory_girl关联方法首先查看现有记录?
注意:我确实尝试定义一个方法来处理这个,但后来我不能使用f.association.我希望能够在像这样的Cucumber场景中使用它:
Given the following user exists:
| Email | Group |
| test@email.com | Name: mygroup |
Run Code Online (Sandbox Code Playgroud)
这只有在工厂定义中使用关联时才有效.
在我的一个rspec测试中,我正在从同一个工厂定义创建多个对象
例如
FactoryBot.create(:model_1)
FactoryBot.create(:model_1)
FactoryBot.create(:model_1)
Run Code Online (Sandbox Code Playgroud)
是否有一种方法factory_bot可以在一行中完成此操作
我知道我能做到
3.times {FactoryBot.create(:model_1)}
Run Code Online (Sandbox Code Playgroud)
但我正在寻找factory_bot能够创建相同模型的多个对象的东西.
我已经玩Rails几年了,并且已经制作了一些正在制作的可通过的应用程序.我总是避免做任何测试,但我决定纠正这个问题.我正在尝试为我已经开始运行但正在不断修改的工作编写的应用程序编写一些测试.我担心任何改变都会破坏事情,所以我想让一些测试运行起来.我已经阅读了RSpec的书,观看了一些截屏视频,但我正在努力开始(这让我觉得你做的事情只有在你实际完成之后才明白).
我正在尝试编写应该是我的ReportsController的简单测试.我的应用程序的问题在于,整个事情几乎都位于身份验证层之后.如果你没有登录就没有任何作用所以我必须先模拟一个登录才能发出一个简单的get请求(虽然我想我应该写一些测试来确保没有登录就没有任何作用 - 我会去以后).
我已经建立了一个RSpec,Capybara,FactoryGirl和Guard的测试环境(不知道使用哪种工具,所以使用Railscasts的建议).到目前为止我编写测试的方法是在FactoryGirl中创建一个用户,就像这样;
FactoryGirl.define do
sequence(:email) {|n| "user#{n}@example.com"}
sequence(:login) {|n| "user#{n}"}
factory :user do
email {FactoryGirl.generate :email}
login {FactoryGirl.generate :login}
password "abc"
admin false
first_name "Bob"
last_name "Bobson"
end
end
Run Code Online (Sandbox Code Playgroud)
然后像这样写我的测试;
require 'spec_helper'
describe ReportsController do
describe "GET 'index'" do
it "should be successful" do
user = Factory(:user)
visit login_path
fill_in "login", :with => user.login
fill_in "password", :with => user.password
click_button "Log in"
get 'index'
response.should be_success
end
end
end
Run Code Online (Sandbox Code Playgroud)
这样就失败了;
1) ReportsController GET 'index' should be successful …Run Code Online (Sandbox Code Playgroud) 问题描述: - 我设置了factory_girl_rails但是每当我尝试加载工厂时,它都会尝试多次加载它.
Environment:
- rails (3.2.1)
- factory_girl (2.5.2)
- factory_girl_rails (1.6.0)
- ruby-1.9.3-p0 [ x86_64 ]
> rake spec --trace
** Execute environment
-- Creating User Factory
-- Creating User Factory
rake aborted!
Factory already registered: user
Run Code Online (Sandbox Code Playgroud)
我改变的唯一的另一件事是:/config/initializers/generator.rb
Rails.application.config.generators do |g|
g.test_framework = :rspec
g.fixture_replacement :factory_girl
end
Run Code Online (Sandbox Code Playgroud)
的Gemfile
gem 'rails', '3.2.1'
# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'
group :assets do
gem 'sass-rails', '~> 3.2.3'
gem 'coffee-rails', '~> 3.2.1'
gem 'uglifier', '>= 1.0.3'
end …Run Code Online (Sandbox Code Playgroud) 当您在dev和Gemfile中的测试块中包含factory_girl_rails gem时,rails会在生成模型时自动生成工厂.
生成模型后有没有办法生成工厂?
我有一个模型Foohas_many'Bar'.我为每个对象都有一个factory_girl工厂.Bar的工厂与Foo有关联; 它会在创建Bar时实例化Foo.
我想要一个创建包含Bar的Foo的Factory.理想情况下,这个Bar将通过:bar工厂创建,并尊重用于创建Foo的构建策略(create/build).
我知道我可以调用:bar工厂,然后从新的Bar中获取Foo引用.我想避免这种情况; 在我的测试用例中,重要的对象是Foo; 称酒吧工厂似乎有点迂回曲折.此外,我可以看到需要一个有多个条形的Foo.
这在Factory_girl有可能吗?你如何在父母中定义这种关系?
我正在使用Rails 2.2项目来更新它.我正在用工厂替换现有的灯具(使用factory_girl)并且遇到了一些问题.问题在于表示具有查找数据的表的模型.当我创建一个包含两个具有相同产品类型的产品的购物车时,每个创建的产品都会重新创建相同的产品类型.这是ProductType模型上唯一验证的错误.
这是一个单元测试,我创建一个Cart并将它们组合在一起.我不得不这样做以解决问题.但这仍然证明了这个问题.我会解释一下.
cart = Factory(:cart)
cart.cart_items = [Factory(:cart_item,
:cart => cart,
:product => Factory(:added_users_product)),
Factory(:cart_item,
:cart => cart,
:product => Factory(:added_profiles_product))]
Run Code Online (Sandbox Code Playgroud)
添加的两个产品属于同一类型,每个产品创建时都会重新创建产品类型并创建重复项.
生成的错误是:"ActiveRecord :: RecordInvalid:验证失败:名称已被占用,代码已被占用"
此示例的解决方法是覆盖正在使用的产品类型并传入特定实例,因此只使用一个实例."add_product_type"提前获取并传入每个购物车项目.
cart = Factory(:cart)
prod_type = Factory(:add_product_type) #New
cart.cart_items = [Factory(:cart_item,
:cart => cart,
:product => Factory(:added_users_product,
:product_type => prod_type)), #New
Factory(:cart_item,
:cart => cart,
:product => Factory(:added_profiles_product,
:product_type => prod_type))] #New
Run Code Online (Sandbox Code Playgroud)
使用factory_girl与"pick-list"类型的关联的最佳方法是什么?
我喜欢为厂家定义为包含,而不必进行组装测试的一切,虽然我可以住在一起.
工厂/ product.rb
# Declare ProductTypes
Factory.define :product_type do |t|
t.name "None"
t.code "none"
end …Run Code Online (Sandbox Code Playgroud) 我正在与factory_girl合作,但看着机械师宝石.你能告诉我 - 迁移到机械师的利弊是什么?你比较过那些libs吗?
我一直跟随此介绍到Rails测试和伊夫遇到一个问题,我似乎无法找到解决.我对Rails非常熟悉,但这是我第一次尝试测试.
无论如何,我有一个非常基本的模型测试,甚至没有完全实现,当我尝试运行rspec spec/models/admin_spec.rb.我Admin has a valid factory在行中得到以下错误(完整代码如下)
Admin has a valid factory
Failure/Error: Factory.create(:admin).should be_valid
NameError:
uninitialized constant Factory
# ./spec/models/admin_spec.rb:6:in `block (2 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)
我认为FactoryGirl由于某种原因没有被加载,但我认为它应该被自动加载.下面是我的Gemfile的完整代码,/ spec/model/admin_spec.rb和/spec/factories/admins.rb
非常感谢您的帮助
的Gemfile
source 'https://rubygems.org'
gem 'rails', '3.2.2'
gem 'mysql2'
gem 'jquery-rails'
gem 'haml'
gem 'bcrypt-ruby', :require => 'bcrypt'
gem 'bootstrap-sass', '~> 2.0.2'
gem 'capistrano'
gem 'json'
gem "paperclip", '~>3.0'
gem 'airbrake'
gem 'acts_as_list'
gem 'nested_form', :git => 'https://github.com/ryanb/nested_form.git'
gem 'bootstrap-wysihtml5-rails'
gem 'will_paginate', '~> 3.0'
gem …Run Code Online (Sandbox Code Playgroud) factory-bot ×10
ruby ×6
rspec ×3
testing ×2
unit-testing ×2
cucumber ×1
factory ×1
fixtures ×1
machinist ×1