1
0
mirror of https://github.com/jbranchaud/til synced 2026-01-03 07:08:01 +00:00

Add Test If deliver_later Is Called For A Mailer as a rails til

This commit is contained in:
jbranchaud
2021-06-23 17:11:56 -05:00
parent 1de308f5b5
commit 18cf50247f
2 changed files with 42 additions and 1 deletions

View File

@@ -10,7 +10,7 @@ pairing with smart people at Hashrocket.
For a steady stream of TILs, [sign up for my newsletter](https://tinyletter.com/jbranchaud).
_1132 TILs and counting..._
_1133 TILs and counting..._
---
@@ -746,6 +746,7 @@ _1132 TILs and counting..._
- [Specify New Attributes For #find_or_create_by](rails/specify-new-attributes-for-find-or-create-by.md)
- [Temporarily Disable strong_params](rails/temporarily-disable-strong-params.md)
- [Test If An Instance Variable Was Assigned](rails/test-if-an-instance-variable-was-assigned.md)
- [Test If deliver_later Is Called For A Mailer](rails/test-if-deliver-later-is-called-for-a-mailer.md)
- [Truncate Almost All Tables](rails/truncate-almost-all-tables.md)
- [Update Column Versus Update Attribute](rails/update-column-versus-update-attribute.md)
- [Upgrading Your Manifest For Sprocket's 4](rails/upgrading-your-manifest-for-sprockets-4.md)

View File

@@ -0,0 +1,40 @@
# 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)
```