示例1:
class DocumentLibrary < ActiveRecord::Base extend FriendlyId friendly_id :title,:use => :slugged has_many :shelves,:dependent => :destroy has_many :documents,:through => :shelves validates :title,:presence => true,:uniqueness => true default_scope :order => :title end
规格:
it "can be shown on the company menu" do
dl = FactoryGirl.create(:document_library,:title => 'Test',:menu => false,:company => true)
dl.should be_valid
end
失败:
1) DocumentLibrary can be shown on the company menu
Failure/Error: dl = FactoryGirl.create(:document_library,title: 'Test',menu: false,company: true)
ArgumentError:
wrong number of arguments (0 for 1)
# ./spec/models/document_library_spec.rb:6:in `block (2 levels) in <top (required)>'
如果我在FactoryGirl.create行之前调用调试器,我得到:
/Users/Jason/.rvm/gems/ruby-1.9.3-p125/gems/activesupport-3.2.1/lib/active_support/dependencies.rb:252:
(rdb:1) c
/Users/Jason/.rvm/gems/ruby-1.9.3-p125/gems/activesupport-3.2.1/lib/active_support/core_ext/module/remove_method.rb:4: `' (NilClass)
from /Users/Jason/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:249:in `set_it_up'
from /Users/Jason/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:200:in `subclass'
from /Users/Jason/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/example_group.rb:187:in `describe'
from /Users/Jason/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/dsl.rb:18:in `describe'
from /Users/Jason/code/rails/teamsite/spec/models/document_library_spec.rb:4:in `<top (required)>'
from /Users/Jason/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/configuration.rb:698:in `load'
from /Users/Jason/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/configuration.rb:698:in `block in load_spec_files'
from /Users/Jason/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/configuration.rb:698:in `map'
from /Users/Jason/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/configuration.rb:698:in `load_spec_files'
from /Users/Jason/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/command_line.rb:22:in `run'
from /Users/Jason/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:80:in `run_in_process'
from /Users/Jason/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:69:in `run'
from /Users/Jason/.rvm/gems/ruby-1.9.3-p125/gems/rspec-core-2.8.0/lib/rspec/core/runner.rb:10:in `block in autorun'
/Users/Jason/.rvm/gems/ruby-1.9.3-p125/gems/activesupport-3.2.1/lib/active_support/core_ext/module/remove_method.rb:4:
示例#2
class Album < ActiveRecord::Base
belongs_to :photo_library
validates :title,:presence => true
validates :title,:uniqueness => {scope: :photo_library_id}
end
class PhotoLibrary < ActiveRecord::Base
default_scope :order => :title
has_many :albums,:dependent => :destroy
validates :title,:uniqueness => true
end
规格:
before :each do
@photo_library = FactoryGirl.create(:photo_library,title: 'Products')
login_admin
end
it "destroys an album" do
3.times { FactoryGirl.create(:album,photo_library: @photo_library) }
visit photo_library_path(@photo_library)
find("h3").click_link 'Delete'
find("#notice").should have_content("Album deleted successfully")
Album.count.should eq 2
end
失败:
1) Albums destroys an album
Failure/Error: login_admin
ArgumentError:
wrong number of arguments (0 for 1)
# ./app/controllers/sessions_controller.rb:8:in `create'
# (eval):2:in `click_button'
# ./spec/requests/albums_spec.rb:7:in `block (2 levels) in <top (required)>'
我的sessions_controller中的第8行是:
user = User.find_by_email(params[:email])
对比例3
FactoryGirl的这个规格很好:
it "is unique within a library" do
pl = FactoryGirl.create(:photo_library,title: 'Products')
pl2 = FactoryGirl.create(:photo_library,title: 'Competitors')
a = FactoryGirl.create(:album,title: 'Gold Series',photo_library: pl)
na = Album.create(photo_library_id: pl.id,title: 'Gold Series')
na.should_not be_valid
na.title = 'Cyclone'
na.should be_valid
na = Album.create(photo_library_id: pl2.id,title: 'Gold Series')
na.should be_valid
end
工厂定义如下:
factory :document_library do
sequence(:title) { |n| "Library Title#{n}" }
end
factory :photo_library do
sequence(:title) { |n| "Photo Library Title#{n}" }
end
factory :album do
sequence(:title) {|n| "Album#{n}"}
end
如果我从DocumentLibrary模型中注释出FriendlyId行,则示例#1通过.我不知道为什么会有所作为.
但是,某些规格仍然没有通过.考虑以下模型(不使用FriendlyId),并规定3.2.1中的flunks:
class DrawingLibrary < ActiveRecord::Base
validates :title,:presence => true
default_scope order: :title
has_many :drawings,:dependent => :destroy
end
it "displays in alpha order" do
FactoryGirl.create(:drawing_library,title: 'C')
FactoryGirl.create(:drawing_library,title: 'B')
FactoryGirl.create(:drawing_library,title: 'A')
ts = ''
DrawingLibrary.all.each do |draw_lib|
ts += draw_lib.title
end
ts.should eq 'ABC'
end
1) DrawingLibrary displays in alpha order
Failure/Error: DrawingLibrary.all.each do |draw_lib|
ArgumentError:
wrong number of arguments (0 for 1)
# ./spec/models/drawing_library_spec.rb:19:in `block (2 levels) in <top (required)>'
结果:rspec spec / models / document_library_spec.rb –backtrace
1) DocumentLibrary can be shown on the company menu Failure/Error: dl = FactoryGirl.create(:document_library,company: true) ArgumentError: wrong number of arguments (0 for 1) # ./spec/models/document_library_spec.rb:6:in `block (2 levels) in <top (required)>'
我使用rvm与ruby 1.9.3,Rubygems在1.8.16. Factory Girl为2.6.0,factory_girl_rails为1.7.0. rspec-rails为2.8.1.
这是我到目前为止所知道的
>降级回到Rails 3.2.0使得所有的工作都可以
>升级到Edge Rails无法解决问题
> rspec宝石的运行边缘版本无法解决问题
>应用程序在开发模式下正常运行和预期.只有测试似乎受到影响.
>降级到ruby 1.9.2不能解决问题
>升级到ruby 1.9.3-p125不能解决问题
>从MysqL到sqlite的测试环境不能解决问题
>将factory_girl_rails降级到1.6.0甚至1.5.0不能解决问题
>使用Factory.create(…)而不是Factory(…)不能解决问题
>使用FactoryGirl.define()和FactoryGirl.create()不能解决问题
>评论FriendlyId的东西使一些规格通过(见下文)
>运行db:test:prepare(或db:reset,db:migrate)无法解决问题
>将FactoryGirl的所有定义/创建更改为一致不会解决问题
>在新的rvm gemset下重新安装宝石(甚至完全重新安装rvm)不能解决问题
>在Test / Unit和FactoryGirl中重写这些测试不产生错误.所以FactoryGirl可能不是问题
任何人都可以指出这个方向吗?还是提供故障排除建议?
这是我的宝石:
source 'http://rubygems.org' gem 'rails','3.2.1' gem 'MysqL2' gem 'dynamic_form' gem 'friendly_id' group :assets do gem 'sass-rails'," ~> 3.2.3" gem 'coffee-rails',"~> 3.2.1" gem 'uglifier','>= 1.0.3' end gem 'jquery-rails' gem 'therubyracer' gem 'bcrypt-ruby' gem 'capistrano' gem "paperclip",:git => "git://github.com/thoughtbot/paperclip.git" group :test,:development do gem 'rspec-rails' gem 'launchy' gem 'ruby-debug19' gem 'database_cleaner' gem 'capybara-webkit' gem 'spork','~> 0.9.0.rc' gem 'guard-spork' end group :development do gem 'fuubar' gem 'powder' end group :test do gem 'turn',:require => false gem 'capybara' gem 'factory_girl_rails' gem 'guard-rspec' end
升级到Rails 3.2.1之后,Gemfile.lock的唯一区别是使用Rails核心库(没有测试宝石更改).
解决方法
$rake db:test:prepare
如果这不能解决问题,那么我首先让我的FactoryGirl定义和调用更加一致 – 不要粗鲁,但是我觉得在你发布的代码中看到3-4种不同的变体.它也使得难以从跟踪中解码隐藏错误消息 – 因为您与调用不一致.
最佳实践定义:
FactoryGirl.define do
factory :document_library do
sequence(:title) { |n| "Title #{n}" }
end
end
最佳实践建设/创作:
document_library = FactoryGirl.create(:document_library,{
title: 'A',visible: false
})
# or
document_library = FactoryGirl.build(:document_library)
我知道你写的它在Rails 3.2.0中工作,一切都是Rails 3.2.1故障,但是可能只是使用3.2.1 MIXED与您使用RSPec和FactoryGirls的版本有关的问题.根据Changelog,Rails 3.2.1中的ActiveRecord模块没有任何更改.
