2

このクラスをどのようにテストしますか? それを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

1 に答える 1

4

テスト用の redis db を作成するには、fakeredisのような gem を使用します。これにより、テスト実行時にクリアできるテスト用の分離されたメモリ内 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
于 2013-01-28T16:59:37.280 に答える