Как проверить действия с работниками очереди?
У меня есть действие 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)