如何使用队列工作者测试操作?

时间:2012-12-01 19:38:10

标签: ruby-on-rails ruby rspec resque

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

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 ==)

如果涉及异步工作者且结果取决于它们,我如何测试此类情况?

2 个答案:

答案 0 :(得分:2)

既然您已经从控制器中分离了邮件传递,那么您也可以将测试解耦。我过去为此做的是使用resque_spec Gem,它允许您添加关于作业是否按预期排队的断言。

您将在测试中添加以下内容:

MailWorker.should have_queued(user.email)

答案 1 :(得分:1)

看一下rescue_spec gem。