Как проверить действия с работниками очереди?

У меня есть действие 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 ответа

Решение

Теперь, когда вы отсоединили доставку почты от вашего контроллера, вы также сможете отсоединить тесты. В прошлом я для этого использовал Gem resque_spec, который позволяет вам добавлять утверждения о том, были ли задания поставлены в очередь в соответствии с ожиданиями.

Вы будете добавлять что-то подобное в свои тесты:

MailWorker.should have_queued(user.email)

Посмотрите на драгоценный камень rescue_spec.

Другие вопросы по тегам