簡體   English   中英

如何使用rspec測試Mongoid :: Observer

[英]How to test Mongoid::Observer with rspec

在一個簡單的mongoid數據模型上,用戶有很多評論,我想在用戶寫至少一條評論時給用戶一個特定的徽章。 所以我建立了一個像這樣的觀察者:

class CommentBadgeObserver < Mongoid::Observer
  observe :comment

  def after_create(comment)
    CommentBadge.check_conditions_for(comment.user)
  end
end

class CommentBadge < Badge
  def self.check_conditions_for(user)
    if user.comments.size > 1
      badge = CommentBadge.create(:title => "Comment badge")
      user.award(badge)
    end
  end
end

user.award方法:

def award(badge)
  self.badges << badge
  self.save
end

以下測試失敗(但我想這是正常的,因為觀察者在后台執行?)

it 'should award the user with comment badge' do
    @comment = Factory(:comment, :user => @user)
    @user.badges.count.should == 1
    @user.badges[0].title.should == "Comment badge"
end

什么是驗證此行為的最佳方法?

我有一個獨立的代碼改編(見下文)。 我不得不做三個小改動,讓它按照你期望的方式工作。

要使Observer正常工作,您必須實例化它。 在我的例子中,我需要添加以下行:

Mongoid.observers = CommentBadgeObserver
Mongoid.instantiate_observers

在Rails中你可以實現相同的功能,將它添加到config / application.rb(根據文檔 ):

config.mongoid.observers = :comment_badge_observer

我認為CommentBadge.check_conditions_for也存在一個小的邏輯錯誤, > 1應該> 0

最后,我更改了User#award方法以保存徽章而不是用戶,因為存儲關系的“外鍵”字段位於徽章一側。

class Comment
  include Mongoid::Document
  field :name
  belongs_to :user
end

class CommentBadgeObserver < Mongoid::Observer
  observe :comment

  def after_create(comment)
    CommentBadge.check_conditions_for(comment.user)
  end
end

class Badge
  include Mongoid::Document
  field :title
  belongs_to :user
end

class CommentBadge < Badge
  def self.check_conditions_for(user)
    if user.comments.size > 0
      badge = CommentBadge.create!(:title => "Comment badge")
      user.award(badge)
    end
  end
end

class User 
  include Mongoid::Document
  field :first_name
  has_many :comments
  has_many :badges

  def award(badge)
    self.badges << badge
    badge.save!
  end
end

Factory.define(:user) do |u|
  u.first_name 'Bob'
end

Factory.define(:comment) do |c|
  c.name 'Some comment...'
end

# Observers need to be instantiated
Mongoid.observers = CommentBadgeObserver
Mongoid.instantiate_observers

describe CommentBadgeObserver do
  it 'should create badges' do
    @user = Factory.build(:user)
    @comment = Factory(:comment, :user => @user)
    @user.badges.count.should == 1
    @user.badges[0].title.should == "Comment badge"
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM