2015-04-16 72 views
12

我有一個問題,運行測試,使用夾具與模型之間的關聯。Rails的 - 測試夾具錯誤NoMethodError:未定義的方法類型爲零: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 

我測試軌道的發動機。這裏是我的燈具:

# 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

哪裏這個錯誤點? –

+0

@MarekLipka對不起,你能澄清更多? –

+0

這是Ruby錯誤,它有回溯。我想看看這個回溯。 –

回答

2

這是不是重複/類似的問題,這個問題?

Loading Rails Fixtures in a Specific Order when Testing

什麼能發生的事情是您的燈具沒有按照正確的順序,所以當項目被引用作爲零出現加載。

從對方的回答的響應,你可以嘗試

這裏是你如何解決您的問題:

  1. 登錄到PostgreSQL用於默認的超級用戶(我的是「Postgres的」) 執行以下命令:

  2. ALTER ROLE yourtestdbuser WITH SUPERUSER;

  3. 享受您的正常工作夾具。

如果你使用的是mysql,它可能是類似的問題。

+0

但是我以'root'身份登錄到mysql用戶 –

+2

您可以添加一個測試到您的問題嗎?在你的問題中的任何地方,當它看起來應該是'item_type'時,你有屬性'type'。謝謝。 –

+0

我有連接到應用程序的'root'用戶帳戶。所以我認爲它已經是超級用戶了。 –

9

在我的開發環境中遷移並回滾幾次後,我遇到了同樣的錯誤。這與「_type」列有關。

是固定的,對我來說唯一的辦法就是下降/創建測試數據庫:

bundle exec rake db:reset RAILS_ENV=test 

有信心你schema.rb是在良好的狀態在此之前。

+1

這也適用於我。 – 23inhouse

+0

@ 23inhouse me too! – Fuser97381

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 
相關問題