【问题标题】:Test priorities on delayed_job plugin in rails测试rails中delayed_job插件的优先级
【发布时间】:2010-08-02 15:52:39
【问题描述】:

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

我怎样才能做这样的测试。

【问题讨论】:

    标签: ruby-on-rails ruby delayed-job


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我实际上实现了测试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
        

        干杯!希望对您有所帮助

        亚历克斯

        【讨论】:

          猜你喜欢
          • 2012-09-04
          • 2016-10-27
          • 1970-01-01
          • 2012-07-17
          • 1970-01-01
          • 1970-01-01
          • 2011-12-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多