mirror of
https://github.com/jbranchaud/til
synced 2026-01-03 07:08:01 +00:00
41 lines
1.3 KiB
Markdown
41 lines
1.3 KiB
Markdown
# Test If deliver_later Is Called For A Mailer
|
|
|
|
There are many ways to test in your controller whether emails are going out. A
|
|
concise and quick way to check is just to see if a `deliver_later` happened.
|
|
|
|
Depending on how your test environment is configured, this could look one of
|
|
two ways.
|
|
|
|
If you have your `queue_adapter` set to
|
|
[`:inline`](https://api.rubyonrails.org/classes/ActiveJob/QueueAdapters/InlineAdapter.html),
|
|
then a `deliver_later` will happen synchronously. So, the email will
|
|
immediately end up in the `deliveries` box.
|
|
|
|
```ruby
|
|
expect {
|
|
post :password_reset, params: valid_params
|
|
}.to change { ActionMailer::Base.deliveries.count }.by(1)
|
|
```
|
|
|
|
The behavior is a bit different if your `queue_adapter` is set to something
|
|
like
|
|
[`:test`](https://api.rubyonrails.org/classes/ActiveJob/QueueAdapters/TestAdapter.html).
|
|
In this case, the email is going to be queued in the app's job queue. Since it
|
|
is not immediately being sent, the expectation will have to be about the job
|
|
queue instead.
|
|
|
|
```ruby
|
|
expect {
|
|
post :password_reset, params: valid_params
|
|
}.to have_enqueued_job(ActionMailer::DeliveryJob)
|
|
```
|
|
|
|
We can even dig into more specifics like this:
|
|
|
|
```ruby
|
|
expect {
|
|
post :password_reset, params: valid_params
|
|
}.to have_enqueued_job(ActionMailer::DeliveryJob)
|
|
.with('UserMailer', 'password_reset', 'deliver_later', Integer)
|
|
```
|