2013-01-18 52 views
2

你會如何測試這個類?你會把它與Resque整合起來,並檢查這個工作是否放在隊列中,或者你是否會嘲笑它,如果你想嘲笑它,你會如何避免重複代碼示例中顯示的代碼。使用Resque排隊進行集成測試或模擬?

class BookingReminderEnqueuer 
    def initialize(user, booking, worker = BookingReminder) 
    @user, @booking, @worker = user, booking, worker 
    end 

    def enqueue 
    Resque.enqueue_at(
     remind_user_at, 
     @worker, 
     booking_id: @booking.id, 
     user_id: @user.id 
    ) if @booking.remind_user? 
    end 

    private 
    def remind_user_at 
    @booking.start_time - 6.hours 
    end 
end 

require 'spec_helper' 
describe BookingReminderEnqueuer 
    describe "#enqueue" do 
    context "when the user should have a reminder" do 
     it "enqueues the reminder" do 
     booking.stub(:remind_user?) { true } 
     Resque.should_receive(:enqueue_at).with(
      booking.start_time - 6.hours, 
      BookingReminder, 
      booking_id: booking.id, 
      user_id: user.id 
     ).once 
     booking_reminder_enqueuer.enqueue 
     end 
    end 

    context "when the user shouldn't have a reminder" do 
     it "does not enqueue the reminder" do 
     booking.stub(:remind_user?) { false } 
     Resque.should_not_receive(:enqueue_at) 
     end 
    end 
    end 
end 

回答

4

我會用像fakeredis這樣的gem創建一個測試redis db。這將創建一個隔離的內存Redis實例,用於測試,可以在測試運行周圍清除。然後,你可以驗證工作與正確的參數與嘲諷的排隊方法(因爲得到排隊參數正常工作正常排隊的是這種方法的心臟。

# Gemfile 
    group :test do 
     gem "rspec" 
     gem "fakeredis", :require => "fakeredis/rspec" 
    end 


    # Spec 
    describe BookingReminderEnqueuer 
     describe "#enqueue" do 
     context "when the user should have a reminder" do 
      it "enqueues the reminder" do 
      booking.stub(:remind_user?) { true } 
      booking_reminder_enqueuer.enqueue 
      resque_job = Resque.peek(:queue_name) 
      resque_job.should be_present 
      # add assertions about job content/scheduling here 
      end 
     end 
     ... 
    end 
    end 
+1

感謝溫菲爾德,我可能會不喜歡這個,我很好奇,這不是Resque工作的真正的測試,而不是我的實現嗎?你會認爲這個測試是好的,因爲它保護了代碼,例如Resque的改變? – Yeggeps

+1

這就是這是一個很好的問題,如果你的BookingReminderEnqueuer中有更多的行爲或邏輯,我可能會爭論嘲笑Resque,然而,它的核心功能似乎是用合適的數據排隊工作。 – Winfield

+0

這對我來說很好,謝謝評論。 – bwight

相關問題