你将如何测试这个类(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/