我在运行使用具有模型之间关联的灯具的测试时遇到问题。
我运行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: <%= 7.days.ago %>
is_featured: true
item_type: 0
item_two:
description: item two description
finished_at: <%= 6.days.ago %>
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
和类似的关联行时。测试效果很好。
- 的修改
这里是回溯
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 `<main>'
修改
此处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 < ActiveRecord::Base
include SevenGallery::Concerns::Gallery
belongs_to :item, :class_name => '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
答案 0 :(得分:10)
在我的开发环境中迁移和回滚几次后,我遇到了同样的错误。这与“_type”列有关。
为我修复它的唯一方法是删除/创建测试数据库:
bundle exec rake db:reset RAILS_ENV=test
在此之前,请确保schema.rb
处于良好状态。
答案 1 :(得分:3)
当您在模型中创建一个在db中没有字段的关系时,会发生此错误。例如:
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
答案 2 :(得分:2)
这不是这个问题的重复/类似问题吗?
Loading Rails Fixtures in a Specific Order when Testing
可能发生的事情是你的灯具没有以正确的顺序加载所以当引用项目时它会出现为零。
从其他答案的回答中,您可以尝试
以下是解决问题的方法:
使用您的默认超级用户登录Postgresql(我的是“postgres”) 执行以下命令:
ALTER ROLE yourtestdbuser with SUPERUSER;
享受正常工作的装置。
如果您使用的是mysql,那可能是类似的问题。
答案 3 :(得分:0)
运行测试时,我几乎犯了相同的错误:NoMethodError: undefined method 'id' for nil:NilClass
或NoMethodError: undefined method 'each' for nil:NilClass
。没有要引用的行号,Lucas' answer的重建有时会起作用,然后会停止工作;稍后我将了解到这是由于夹具文件的缓存和加载顺序。
我的错误是我的固定装置设置方式。我通过运行具有this StackOverflow answer中所述的完整回溯的测试来发现这一点:
BACKTRACE=YES rake test test/controllers/document_submissions_controller_test.rb
这指向ActiveSupport中抛出错误的gem文件。这是单个测试的完整日志:
所以看来错误在于加载我的装置,因为错误源自active_record/fixtures.rb:758
(请参见上面突出显示的行)。但是,我的应用程序中包含大量固定装置,我需要缩小范围,尤其是引起问题的原因。
我使用以下命令在代码编辑器中打开了active_record/fixtures.rb:758
文件:
code /Users/mattmcinnis/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.0/lib/active_record/fixtures.rb
注意:我在code
命令中使用VSCode,但是任何代码编辑器都可以。
在发生错误的第758行,我看到了以下代码:
FixtureSet::File.open(file) do |fh|
fh.each do |fixture_name, row| # line 758
fixtures[fixture_name] = ActiveRecord::Fixture.new(row, model_class)
end
end
..我包裹在救援块中,并修改为:
FixtureSet::File.open(file) do |fh|
begin
fh.each do |fixture_name, row|
fixtures[fixture_name] = ActiveRecord::Fixture.new(row, model_class)
end
rescue
debugger
end
end
注意:完成后,请务必将对此文件的所有更改还原!
我对在上面的循环中由变量fh
捕获的哪个文件引起错误感兴趣。再次运行测试套件,我遇到了断点,并找到了导致问题的文件名:
> (byebug) fh
=> ... @file="permissions.yml"
在我的permissions.yml
文件中,我的装置通过硬编码“ id”来引用相关模型,而不是通过名称引用:
例如permissions.yml
permission1:
...
user_id: <%= User.first.id %> # Bad!
将最后一行固定为user: user1
之类,以引用user1
中的users.yml
固定装置即可解决此问题。
希望这对某人有帮助。我花了半天时间,发现它很难诊断。