【问题标题】:How to test actions with queue workers?如何使用队列工作人员测试操作?
【发布时间】:2012-12-02 04:01:54
【问题描述】:

我在UsersController 中有一个动作create,看起来像这样

def create
  @user = User.new(params[:user])
  if @user.save
    sign_in_as(@user)
    Resque.enqueue(MailWorker, @user.email)
    redirect_to root_url, notice: "Thanks"
  else
    render "new"
  end
end

在我将reqsue 添加到此操作之前,我一直在测试这样的电子邮件确认

it "creates a new user account" do
  # code for creating a new account...

  ActionMailer::Base.deliveries.size.should == 1
  mail = ActionMailer::Base.deliveries.last
  mail.to.should == [user[:email]]
  mail.body.encoded.should match(/Thank you for registration/)
end

但是现在,由于我添加了 resque worker 来传递消息,我猜它不会立即传递消息,因此我得到这个测试失败并显示消息

 Failure/Error: ActionMailer::Base.deliveries.size.should == 1
   expected: 1
        got: 0 (using ==)

当涉及异步工作人员并且结果取决于他们时,我如何测试这种情况?

【问题讨论】:

    标签: ruby-on-rails ruby rspec resque


    【解决方案1】:

    现在您已经将邮件传递与控制器分离,您还可以分离测试。我过去为此所做的是使用resque_spec Gem,它可以让您添加关于作业是否已按预期排队的断言。

    您将在测试中添加类似这样的内容:

    MailWorker.should have_queued(user.email)
    

    【讨论】:

      【解决方案2】:

      看看rescue_spec gem。

      【讨论】:

        猜你喜欢
        • 2019-01-16
        • 2015-03-10
        • 1970-01-01
        • 2019-02-22
        • 1970-01-01
        • 1970-01-01
        • 2012-06-30
        • 1970-01-01
        • 2017-02-01
        相关资源
        最近更新 更多