1

我有一个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 ==)

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

4

2 回答 2

2

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

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

MailWorker.should have_queued(user.email)
于 2012-12-01T20:01:54.867 回答
1

看看rescue_spec gem。

于 2012-12-01T19:57:00.100 回答