Rails – 测试夹具错误NoMethodError:nil的未定义方法`type’:NilClass

我在运行使用具有模型之间关联的夹具的测试时遇到问题。

一旦我运行rake test ,这就是我得到的错误:

 ERROR["test_truth", SevenPortfolioTest, 0.005154775] test_truth#SevenPortfolioTest (0.01s) NoMethodError: NoMethodError: undefined method `type' for nil:NilClass ERROR["test_should_destroy_item_video", SevenPortfolio::ItemVideosControllerTest, 0.008887804] test_should_destroy_item_video#SevenPortfolio::ItemVideosControllerTest (0.01s) NoMethodError: NoMethodError: undefined method `type' for nil:NilClass ERROR["test_should_get_index", SevenPortfolio::ItemVideosControllerTest, 0.011364416] test_should_get_index#SevenPortfolio::ItemVideosControllerTest (0.01s) NoMethodError: NoMethodError: undefined method `type' for nil:NilClass ERROR["test_should_create_item_video", SevenPortfolio::ItemVideosControllerTest, 0.014584266] test_should_create_item_video#SevenPortfolio::ItemVideosControllerTest (0.01s) NoMethodError: NoMethodError: undefined method `type' for nil:NilClass ERROR["test_should_get_new", SevenPortfolio::ItemVideosControllerTest, 0.017282812] test_should_get_new#SevenPortfolio::ItemVideosControllerTest (0.02s) NoMethodError: NoMethodError: undefined method `type' for nil:NilClass ERROR["test_should_update_item_video", SevenPortfolio::ItemVideosControllerTest, 0.019729858] test_should_update_item_video#SevenPortfolio::ItemVideosControllerTest (0.02s) NoMethodError: NoMethodError: undefined method `type' for nil:NilClass ERROR["test_should_get_edit", SevenPortfolio::ItemVideosControllerTest, 0.022365633] test_should_get_edit#SevenPortfolio::ItemVideosControllerTest (0.02s) NoMethodError: NoMethodError: undefined method `type' for nil:NilClass ERROR["test_should_destroy_item", SevenPortfolio::ItemsControllerTest, 0.025860205] test_should_destroy_item#SevenPortfolio::ItemsControllerTest (0.03s) NoMethodError: NoMethodError: undefined method `type' for nil:NilClass ERROR["test_should_get_edit", SevenPortfolio::ItemsControllerTest, 0.030867796] test_should_get_edit#SevenPortfolio::ItemsControllerTest (0.03s) NoMethodError: NoMethodError: undefined method `type' for nil:NilClass ERROR["test_should_show_item", SevenPortfolio::ItemsControllerTest, 0.036687105] test_should_show_item#SevenPortfolio::ItemsControllerTest (0.04s) NoMethodError: NoMethodError: undefined method `type' for nil:NilClass ERROR["test_should_update_item", SevenPortfolio::ItemsControllerTest, 0.040130774] test_should_update_item#SevenPortfolio::ItemsControllerTest (0.04s) NoMethodError: NoMethodError: undefined method `type' for nil:NilClass ERROR["test_should_create_item_with_video", SevenPortfolio::ItemsControllerTest, 0.042776553] test_should_create_item_with_video#SevenPortfolio::ItemsControllerTest (0.04s) NoMethodError: NoMethodError: undefined method `type' for nil:NilClass ERROR["test_should_get_index", SevenPortfolio::ItemsControllerTest, 0.045301694] test_should_get_index#SevenPortfolio::ItemsControllerTest (0.05s) NoMethodError: NoMethodError: undefined method `type' for nil:NilClass ERROR["test_should_get_new", SevenPortfolio::ItemsControllerTest, 0.048094189] test_should_get_new#SevenPortfolio::ItemsControllerTest (0.05s) NoMethodError: NoMethodError: undefined method `type' for nil:NilClass ERROR["test_should_create_item_with_gallery", SevenPortfolio::ItemsControllerTest, 0.051019403] test_should_create_item_with_gallery#SevenPortfolio::ItemsControllerTest (0.05s) NoMethodError: NoMethodError: undefined method `type' for nil:NilClass 

我正在测试一个rails引擎。 这是我的装置:

 # test/fixtures/seven_portfolio/items.yml item_one: description: item one description finished_at:  is_featured: true item_type: 0 item_two: description: item two description finished_at:  is_featured: false item_type: 1 # test/fixtures/seven_gallery/galleries.yml gallery_one: title: seven_gallery_gallery_one_title item: item_one # test/fixtures/seven_gallery/photos.yml photo_one: caption: photo_one_caption gallery: gallery_one # test/fixtures/seven_portfolio/item_videos.yml one: item: item_one 

例如,当我删除item: item_one和类似的关联item: item_one 。 测试效果很好。

编辑

这是回溯

 Command failed with status (1): [ruby -I"lib:lib:test" "/home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/rake_test_loader.rb" "test/**/*_test.rb" ] /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/testtask.rb:108:in `block (3 levels) in define' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/file_utils.rb:57:in `call' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/file_utils.rb:57:in `sh' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/file_utils_ext.rb:37:in `sh' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/file_utils.rb:96:in `ruby' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/file_utils_ext.rb:37:in `ruby' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/testtask.rb:104:in `block (2 levels) in define' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/file_utils_ext.rb:58:in `verbose' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/testtask.rb:100:in `block in define' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/task.rb:240:in `call' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/task.rb:240:in `block in execute' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/task.rb:235:in `each' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/task.rb:235:in `execute' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/task.rb:179:in `block in invoke_with_call_chain' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/monitor.rb:211:in `mon_synchronize' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/task.rb:172:in `invoke_with_call_chain' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/task.rb:165:in `invoke' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/application.rb:150:in `invoke_task' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/application.rb:106:in `block (2 levels) in top_level' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/application.rb:106:in `each' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/application.rb:106:in `block in top_level' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/application.rb:115:in `run_with_threads' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/application.rb:100:in `top_level' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/application.rb:78:in `block in run' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/application.rb:176:in `standard_exception_handling' /home/rafael/.rbenv/versions/2.2.0/lib/ruby/2.2.0/rake/application.rb:75:in `run' /home/rafael/.rbenv/versions/2.2.0/bin/rake:33:in `' 

编辑

这是Item类:

 module SevenPortfolio class Item < ActiveRecord::Base has_one :item_video, class_name:'SevenPortfolio::ItemVideo', foreign_key: "seven_portfolio_item_id" has_one :item_gallery, class_name: 'SevenGallery::Gallery', foreign_key: "seven_portfolio_item_id" accepts_nested_attributes_for :item_video, :item_gallery before_save :process_type def process_type self.build_item_video if self.item_type == 0 self.build_item_gallery if self.item_type == 1 end def type_content self.item_gallery if self.item_type == 0 self.item_video if self.item_type == 1 end end end 

Gallery类:

 class SevenGallery::Gallery  'SevenPortfolio::Item' end 

编辑这是schema.rb文件:

 ActiveRecord::Schema.define(version: 20150414145951) do create_table "seven_gallery_galleries", force: :cascade do |t| t.string "title", limit: 255 t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "seven_portfolio_item_id", limit: 4 end add_index "seven_gallery_galleries", ["seven_portfolio_item_id"], name: "index_seven_gallery_galleries_on_seven_portfolio_item_id", using: :btree create_table "seven_gallery_photos", force: :cascade do |t| t.string "caption", limit: 255 t.string "image", limit: 255 t.integer "seven_gallery_gallery_id", limit: 4 t.datetime "created_at", null: false t.datetime "updated_at", null: false t.boolean "is_new", limit: 1, default: true t.boolean "is_featured", limit: 1, default: false t.text "description", limit: 65535 t.string "alt", limit: 255 t.integer "position", limit: 4, default: 0 end add_index "seven_gallery_photos", ["seven_gallery_gallery_id"], name: "index_seven_gallery_photos_on_seven_gallery_gallery_id", using: :btree create_table "seven_portfolio_item_videos", force: :cascade do |t| t.string "url", limit: 255 t.text "description", limit: 65535 t.string "title", limit: 255 t.integer "seven_portfolio_item_id", limit: 4 t.datetime "created_at", null: false t.datetime "updated_at", null: false end add_index "seven_portfolio_item_videos", ["seven_portfolio_item_id"], name: "index_seven_portfolio_item_videos_on_seven_portfolio_item_id", using: :btree create_table "seven_portfolio_items", force: :cascade do |t| t.datetime "created_at", null: false t.datetime "updated_at", null: false t.text "description", limit: 65535 t.date "finished_at" t.boolean "is_featured", limit: 1, default: false t.integer "item_type", limit: 4, default: 0 end add_foreign_key "seven_gallery_galleries", "seven_portfolio_items", on_delete: :cascade add_foreign_key "seven_gallery_photos", "seven_gallery_galleries", on_delete: :cascade add_foreign_key "seven_portfolio_item_videos", "seven_portfolio_items", on_delete: :cascade end 

在我的开发环境中迁移和回滚几次后,我遇到了同样的错误。 这与“_type”列有关。

为我修复它的唯一方法是删除/创建测试数据库:

 bundle exec rake db:reset RAILS_ENV=test 

在执行此操作之前,请确保您的schema.rb处于良好状态。

在您建模时,会发生此错误,您创建的关系在数据库中没有字段。 例:

 class Contact < ActiveRecord::Base belongs_to account end 

但在你的表联系人:

 create_table "contacts", force: :cascade do |t| t.string "fname" t.string "lname" t.string "title" t.string "description" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.boolean "primary" t.integer "contactable_id" t.integer "contactable_type" end 

看到没有account_id字段。

在我的情况下,我忘了更新模型的belongs_to是多态的:

 class Contact < ActiveRecord::Base belongs_to :contactable, polymorphic: true end class Account < ActiveRecord::Base has_many :contacts, as: :contactable end 

这不是这个问题的重复/类似问题吗?

测试时按特定顺序装载导轨夹具

可能发生的事情是你的灯具没有按照正确的顺序加载,因此当引用项目时它会显示为零。

从其他答案的回答你可以尝试

以下是解决问题的方法:

  1. 使用默认超级用户登录Postgresql(我的是“postgres”)执行以下命令:

  2. ALTER ROLE yourtestdbuser with SUPERUSER;

  3. 享受你正常工作的灯具。

如果您使用的是mysql,那可能是类似的问题。