我正在使用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,如果我想用照片创建其中五个用户,我如何建立一个具有特征(特质存在)的用户列表?
无法调用"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: …
我正在使用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) 与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) 我有一些用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) 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)
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)
失败:
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) 或者是生成随机和唯一用户名所必需的外部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验证意味着名字和姓氏自动无效,因为它们中有一个数字.与独特性无关.
那么我该如何创建这些独特的名字呢?
我是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是最高得分手,因为测试运行的状态不正确.
工厂女孩是否提供从数据库中删除记录然后回滚此删除?类似于它在数据库中创建记录和回滚的方式
我有一个相当厚实的工厂女孩特质,接受参数并创建一个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) 我从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)
所以,
.upcased模型的真正属性吗?transient块真正在做什么?设置可以在工厂中使用的变量?evaluator?它总是需要最后传递吗?如果您的create函数使用特征,瞬态并具有多个值,该怎么办?