unit testing与夹具的多态关联

我收到此错误消息:

ERROR["test_profile_display", UsersProfileTest, 2.569931] test_profile_display#UsersProfileTest (2.57s) NoMethodError: NoMethodError: undefined method `posts' for nil:NilClass app/controllers/users_controller.rb:14:in `show' test/integration/users_profile_test.rb:22:in `block in ' app/controllers/users_controller.rb:14:in `show' test/integration/users_profile_test.rb:22:in `block in ' 

@posts = @user.character.posts.paginate(page: params[:page])行中的UsersController中的character似乎是nil。 用户和角色之间存在多态关系。 我以为我在fixtures中使用了正确的语法告诉rails用户Bazley有一个fixture:在characters.yml中:

 character_bazley: sociable: bazley (user) 

如何说服rails用户夹具确实有属于它的角色?

测试/集成/ users_profile_test.rb:

 require 'test_helper' class UsersProfileTest img.gravatar' assert_match @user.character.posts.count.to_s, response.body assert_select 'div.pagination' @user.character.posts.paginate(page: 1).each do |post| assert_match post.content, response.body end end end # UsersProfileTest 

user.rb:

 class User < ActiveRecord::Base attr_accessor :remember_token, :activation_token, :reset_token has_one :character, as: :sociable, dependent: :destroy . . end 

character.rb:

 class Character < ActiveRecord::Base belongs_to :sociable, polymorphic: true has_many :posts, dependent: :destroy validates :sociable_id, presence: true end # Character 

users.yml里:

 bazley: name: Bazley email: bazley@oxdorf.com callsign: bazley password_digest:  admin: true activated: true activated_at:  

characters.yml:

 character_bazley: sociable: bazley (user) 

在UsersController中:

 def show @user = User.find_by_callsign(params[:callsign]) @posts = @user.character.posts.paginate(page: params[:page]) # the line causing the error @page_name = "user_page" redirect_to root_url and return unless @user.activated end 

characters.yml更改为

 character_bazley: sociable: bazley (User) 

代替

 character_bazley: sociable: bazley (user) 

注意它是User而不是user 。 这里User的关键字User将告诉sociable_typeUser类。

参考:

http://ruby-journal.com/rails/define-fixtures-with-polymorphic-association/ http://api.rubyonrails.org/v3.2.8/classes/ActiveRecord/Fixtures.html#label-Polymorphic+belongs_to