ruby-on-rails - Rails/Rspec : Testing delayed_job mails

标签 ruby-on-rails rspec delayed-job

只是想知道如何测试 actionmailer 请求实际上发送到 rspec 中的延迟作业队列。

我会认为它很简单,但我的 delay_job 队列似乎没有增加。代码如下:

Controller :

  def create
    @contact = Contact.new(params[:contact])
      if @contact.save
        contactmailer = ContactMailer
        contactmailer.delay.contact_message(@contact)
        redirect_to(contacts_url)
      else
        render :action => "new"
      end

规范:
  it "queues mail when a contact is created" do
    expectedcount = Delayed::Job.count + 1
    Contact.stub(:new).with(mock_contact()) { mock_contact(:save => true) }
    post :create, :contact => mock_contact
    expectedcount.should eq(Delayed::Job.count)
  end

在调用 Controller 之前和之后,Delayed::Job.count 都返回 0。我已经尝试从 Controller 中取出条件,但我仍然无法让延迟的作业计数增加。

任何建议表示赞赏 - 欢呼

最佳答案

您还可以通过运行作业或关闭排队来测试作业将执行的操作。

随时调整配置(即在 before :each 块中)。

Delayed::Worker.delay_jobs = false

或执行您保存的作业
Delayed::Worker.new.work_off.should == [1, 0]

我已经愉快地使用这种方法一段时间了。一方面,使用新的 any_instance在 RSpec 中支持,您可以直接测试您的延迟方法效果。但是,我发现使用 work_off 的测试要慢。

我现在通常做的是:
mock_delay = double('mock_delay').as_null_object
MyClass.any_instance.stub(:delay).and_return(mock_delay)
mock_delay.should_receive(:my_delayed_method)

然后我有一个单独的规范 my_delayed_method .这要快得多,而且可能是更好的单元测试实践——特别是对于 Controller 。虽然如果你正在做请求规范或其他集成级别的规范,那么你可能仍然想使用 work_off .

关于ruby-on-rails - Rails/Rspec : Testing delayed_job mails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6352333/

相关文章:

ruby-on-rails - 压缩 Ruby on Rails IF-ELSE 代码

ruby-on-rails - Rails 闪存消息助手

mysql - ActiveRecord:一一连接多个数据库

rspec - 显示 rspec 中所有待处理、通过和错误测试

ruby-on-rails - 在多台机器上使用delay_job,其中一些任务需要在本地运行

ruby-on-rails - 使用 ActionMailer 在选定的时间发送邮件?

ruby-on-rails - 在 Rails 6 上添加外部 js 文件

ruby-on-rails - Ruby 类图不显示在 RubyMine 的图表菜单中

rspec - 我可以只为一个参数调用覆盖 RSpec 中的一个方法吗

ruby-on-rails - 在客户端等待时使用工作人员处理作业,并在完成后返回响应