ruby - 使用 Resque 排队进行集成测试或模拟?

标签 ruby rspec mocking integration-testing resque

你将如何测试这个类(class)?您会将其与 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

最佳答案

我会使用像 fakeredis 这样的 gem创建一个测试 redis 数据库。这将创建一个隔离的内存中 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

关于ruby - 使用 Resque 排队进行集成测试或模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14397567/

相关文章:

Ruby 未定义方法 `+' 为 nil :NilClass (NoMethodError)

ruby - 在 Mac OS X 上安装 Homebrew 无法连接到 raw.githubusercontent.com 端口 443

java - 验证一个函数是从另一个函数mockito调用的

ruby-on-rails - 我可以使用 RSpec 来测试已部署的站点吗?

c# - .NET : Usage Example? 的 Faker-cs 包

android - 即使使用 Mockito 在 Android 中通过单元测试,也总是会出现线程错误

ruby-on-rails - Easy Ruby 数据表/搜索问题

ruby - 有没有人想出一种方法来在多个浏览器/网络驱动程序上运行相同的 cucumber 场景?

ruby-on-rails - RSpec 如何测试传递给方法的参数数据类型

ruby-on-rails - Minitest-测试 Controller 问题