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
感謝溫菲爾德,我可能會不喜歡這個,我很好奇,這不是Resque工作的真正的測試,而不是我的實現嗎?你會認爲這個測試是好的,因爲它保護了代碼,例如Resque的改變? – Yeggeps
這就是這是一個很好的問題,如果你的BookingReminderEnqueuer中有更多的行爲或邏輯,我可能會爭論嘲笑Resque,然而,它的核心功能似乎是用合適的數據排隊工作。 – Winfield
這對我來說很好,謝謝評論。 – bwight