2015-07-24 2 views
0

Я тестирую функции Rails 4 приложений Sidekiq в отношении отправки электронных писем. У меня простой вопрос. Мой работникRSpec и Sidekiq: выполнение почтовых сообщений электронной почты, чтобы вы могли протестировать их содержимое.

def perform(response_id) 
    response = Response.find(response_id) 
    micropost = response.micropost 
    if response && micropost 
     MicropostMailer.notify_question_followers_of_response(micropost, response, micropost.user.email).deliver_now unless micropost.user == response.user 
     micropost.followers.select{|follower| follower != response.user}.map{|follower|MicropostMailer.notify_question_followers_of_response(micropost, response, follower.email).deliver_now} 
    end 
end 

Отправляет несколько писем, как вы можете видеть. Детали не так важны (я думаю).

expect { MicropostWorker.perform_async(@answer.id) }.to change(MicropostWorker.jobs, :size).by(1) 

... делает то, что он должен.

Но я хочу ознакомиться с особенностями электронных писем, чтобы проверить, что они подходят людям. Каждый раз, когда я ...

expect(ActionMailer::Base.deliveries.length).to eq(3) 

например, я получаю 0, что, я полагаю, связано с тем, что электронные письма не отправляются немедленно. Как я «выполнить асинхронную отправку» в тесте, так что я могу смотреть на эти электронные письма

Я видел

perform_enqueued_jobs do 
    expect(ActionMailer::Base.deliveries.length).to eq(3) 
    end 

В другой вопрос, но я думаю, что это старый ....

+0

в этом случае вы можете запустить работу «инлайн», который будет запускать их сразу, и, следовательно, вы получите возможность проверить специфику электронной почты. проверить эту страницу https://github.com/mperham/sidekiq/wiki/Testing –

ответ

0

Пропустить Sidekiq и проверить его как обычный объект Ruby:

MicropostWorker.new.perform(fakeanswer.id) 
expect(ActionMailer::Base.deliveries.length).to eq(3) 
Смежные вопросы