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_type
是User
类。
参考:
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