2

我想测试延迟作业插件中优先级的工作方式。我正在使用 railscasts 的 mailit 应用程序。我想我想发送 100 条高优先级消息和 100 条低优先级消息。我想看看优先级较低的消息是否会按时发送,或者它们会被搁置一旁。

我怎么能做这样的测试。

4

3 回答 3

1

创建这样的测试不应该是一个大问题。生成 100 封具有高优先级的电子邮件,然后生成 100 封具有低优先级的电子邮件。或相反亦然。在您检查数据库以查看每项工作都在那里并进行说明之前,请不要启动您的工作人员。启动您的工作人员并观察工作是如何执行的——并且以正确的顺序执行。请记住,d_j 中的优先级是递增的,因此优先级 1 高于 10。

现在,200 个工作岗位并不多。您的员工可能会相当快地执行它们。如果您真的想测试您的低优先级电子邮件是否仍然被发送,您可能不得不依赖于您队列中的其他内容——前提是您使用 d_j 不仅仅是电子邮件。我建议在队列中填充至少几千个作业——或者任何你能想象到的“最坏情况”——并用它来运行测试。如果非电子邮件作业的优先级高于低优先级电子邮件,则它们比 100 个高优先级邮件更可能影响电子邮件传递。

于 2010-03-17T07:37:56.423 回答
0

我实际上实现了测试来测试 DelayedJob 处理发送电子邮件。测试其实很简单。

您应该将 2 个作业(而不是 100 个)排入队列,一个具有高优先级,一个具有较低优先级。然后您可以使用“Delayed::Job.work_off”方法执行第一个作业,然后断言较低优先级的作业仍在数据库中等待。如果您仍然不确定如何执行作业,请查看库。代码写得很好。

这是我的应用程序的代码摘录。基本上我需要向用户发送提醒电子邮件,所以我需要确保作业正确执行并且邮件不会爆炸。我把这个测试放在了reminder_test.rb 单元测试文件中,因为提醒模型知道如何排队和发送电子邮件。

# enqueue the jobs here

assert_difference 'Delayed::Job.count', -1, 'Job should execute successfully' do
  assert_difference 'ActionMailer::Base.deliveries.count' do
    Delayed::Job.work_off
  end 
end

# make sure the email was properly delivered
email = ActionMailer::Base.deliveries.last
assert_equal email.to[0], @user.email
assert (Time.now - @reminder.reload.sent_at) < 1.seconds

干杯! 希望这有帮助

亚历克斯

于 2010-08-02T07:52:39.707 回答
0

如果您有兴趣了解这些邮件到达真正收件人的速度有多快,您可以做一件事:发送这些邮件。如果没有真正经历完整的传递过程,绝对无法知道有多少邮件会由于灰名单、MX 故障、MX 拥塞、内容扫描仪损坏(或更糟糕的是 SMTP 代理模式下的内容扫描仪损坏)而延迟,接收服务器上的 Internet 连接中断等。

于 2009-09-09T20:29:58.443 回答