2013-01-18 54 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

相关问题