Ruby 使用Resque排队进行集成测试或模拟?
你将如何测试这门课?您会将它与Resque集成并检查作业是否放入队列中,还是会模拟它,如果要模拟它,如何避免像示例spec中所示那样重复代码Ruby 使用Resque排队进行集成测试或模拟?,ruby,rspec,mocking,integration-testing,resque,Ruby,Rspec,Mocking,Integration Testing,Resque,你将如何测试这门课?您会将它与Resque集成并检查作业是否放入队列中,还是会模拟它,如果要模拟它,如何避免像示例spec中所示那样重复代码 class BookingReminderEnqueuer def initialize(user, booking, worker = BookingReminder) @user, @booking, @worker = user, booking, worker end def enqueue Resque.enqueu
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
我想用一个gem来创建一个测试redisdb。这将为测试创建一个独立的内存中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
我将使用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
谢谢Winfield,我可能会这样做。不过我很好奇,这不是真的在测试Resque工作,而不是我的实现吗?你会说这个测试很好,因为它可以保护代码,比如说Resque的更改吗?这是个好问题。如果你的BookingReminder中有更多的行为或逻辑Enqueuer,我可能会支持模拟Resque。但是,它的核心功能似乎是使用正确的数据将作业排队。感谢Winfield,我可能会这样做。我很好奇,这不是真的测试Resque工作,而不是我的实现吗?你会说这个测试很好,因为它保护了来自的代码,例如Resque中的更改?这是一个好问题。如果BookingReminderQueuer中有更多的行为或逻辑,我可能会支持模拟Resque。但是,核心功能似乎是使用适当的数据将作业排队。