首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么升级到Rails 3.2.1会导致多个Rspec测试失败?

为什么升级到Rails 3.2.1会导致多个Rspec测试失败?
EN

Stack Overflow用户
提问于 2012-02-13 20:44:59
回答 5查看 2.5K关注 0票数 13

我测试套件中的所有211个规范都通过了fine...until,我从rails 3.2升级到rails 3.2.1。现在,197我的规格失败与错误。这些错误中的大多数都有下面描述的“错误的参数数(0对1)”错误。

示例1:

代码语言:javascript
运行
复制
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

规格:

代码语言:javascript
运行
复制
  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

在以下方面失败:

代码语言:javascript
运行
复制
   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行之前调用调试器,则得到:

代码语言:javascript
运行
复制
/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

代码语言:javascript
运行
复制
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, :presence => true
  validates :title, :uniqueness => true
end

规格:

代码语言:javascript
运行
复制
  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

在以下方面失败:

代码语言:javascript
运行
复制
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行是:

代码语言:javascript
运行
复制
user = User.find_by_email(params[:email])

在这一点上检查params显示了一切(包括:电子邮件)都是它应该存在的。

对比示例#3

使用FactoryGirl的这个规范传递得很好:

代码语言:javascript
运行
复制
  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

工厂的定义如下:

代码语言:javascript
运行
复制
  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

如果我注释掉了FriendlyId模型中的DocumentLibrary行,示例1就会通过。我不知道这有什么区别。

然而,一些规格仍然不能通过。考虑以下模型(它不使用FriendlyId)和3.2.1中的错误规范:

代码语言:javascript
运行
复制
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规范/模型/document_library_spec.rb-回溯

代码语言:javascript
运行
复制
 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)>'

我使用rvm和ruby 1.9.3,Rubygems在1.8.16。“工厂女孩”是2.6.0,factory_girl_rails是1.7.0。rspec-rails为2.8.1。

,我到目前为止知道的是:

  • 降级回Rails 3.2.0使一切恢复正常
  • 升级到边缘Rails并不能解决问题
  • rspec宝石的边缘版本无法解决这个问题
  • 该应用程序运行正常,并按预期在开发模式下运行。似乎只有测试会受到影响。
  • 降级到卢比1.9.2并不能解决问题
  • 升级到ruby 1.9.3-p 125并不能解决这个问题
  • 为测试环境从MySQL更改为SQLite并不能解决问题
  • 将factory_girl_rails降级到1.6.0甚至1.5.0并不能解决问题
  • 使用Factory.create(.)代替工厂(.)解决不了问题
  • 使用FactoryGirl.define()和FactoryGirl.create()并不能解决问题
  • 注释掉FriendlyId的内容会使一些规范通过(见下文)
  • 运行db:test:准备(或db:reset,db:migrate)没有解决问题
  • 将所有FactoryGirl定义/创建更改为一致并不能解决问题
  • 在新的rvm宝石集下重新安装gems (甚至完全重新安装rvm )并不能解决这个问题
  • 在Test/Unit和FactoryGirl中重写这些测试不会产生错误。所以FactoryGirl可能不是问题所在

,有人能指点我这个方向吗?或者提供故障排除建议?

这是我的个人档案:

代码语言:javascript
运行
复制
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核心库(没有测试宝石改变)。

EN

回答 5

Stack Overflow用户

发布于 2012-02-22 07:50:59

您可以尝试的第一件事(根据列表您还没有)就是从测试DB中删除所有数据并“重置”您的测试环境。由于某些原因,可能您的DB充满了测试数据,序列无法工作和/或迁移尚未运行。

$ rake db:test:prepare

如果这不能解决问题,那么我会首先使我的FactoryGirl-定义和调用更一致-不是粗鲁,但我想我看到3-4不同的变化,整个代码张贴。它还增加了从跟踪中解码神秘错误消息的难度--因为您与调用不一致。

最佳做法定义:

代码语言:javascript
运行
复制
FactoryGirl.define do
  factory :document_library do
    sequence(:title) { |n| "Title #{n}" }
  end
end

最佳做法-建立/创造:

代码语言:javascript
运行
复制
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与您使用的RSpec和FactoryGirls版本可能有一个问题。根据Changelog,Rails 3.2.1中的ActiveRecord模块没有发生任何更改。

票数 3
EN

Stack Overflow用户

发布于 2012-02-21 14:52:37

这可能不是根本原因,但由于您的错误暗示了FactoryGirl,我首先将所有工厂(及其创建)转换为另一个工厂(new/推荐(?)语法,即FactoryGirl.define do ...doclib = FactoryGirl.create(:document_library ...。在运行规范时,Factory可能会有所不同(与控制台中的情况不同)。

票数 2
EN

Stack Overflow用户

发布于 2012-02-23 00:59:28

它可能是模型中过时的语法。替换

代码语言:javascript
运行
复制
default_scope order: :title 

使用

代码语言:javascript
运行
复制
 default_scope :order => :title 

如果我注释掉FriendlyId模型中的DocumentLibrary行,那么上面的规范就通过了。我不知道这有什么区别

通过这种修改,default_scope order: :title成为模型的最后一行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9267740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档