mirror of
https://github.com/jbranchaud/til
synced 2026-01-03 07:08:01 +00:00
Add Check Specific Attributes On ActiveRecord Array as a rails til
This commit is contained in:
31
rails/check-specific-attributes-on-activerecord-array.md
Normal file
31
rails/check-specific-attributes-on-activerecord-array.md
Normal file
@@ -0,0 +1,31 @@
|
||||
# Check Specific Attributes On ActiveRecord Array
|
||||
|
||||
If you're writing a test against a method that returns a collection of
|
||||
ActiveRecord results, it can be tedious to check specific values for each.
|
||||
There are certainly an endless number of ways to approach those assertions.
|
||||
|
||||
You can keep your assertion fairly concise by using nested RSpec matchers.
|
||||
There are two in particular that can help with this kind of check:
|
||||
|
||||
```ruby
|
||||
books = get_books_by("David Sedaris")
|
||||
|
||||
expect(books).to match_array(
|
||||
[
|
||||
have_attributes(
|
||||
"title" => "Calypso",
|
||||
"publication_year" => "2018",
|
||||
),
|
||||
have_attributes(
|
||||
"title" => "Theft By Finding",
|
||||
"publication_year" => "2017",
|
||||
),
|
||||
],
|
||||
)
|
||||
```
|
||||
|
||||
The outer part of the assertion is `match_array` which checks that the result
|
||||
is an array of a certain size with specific elements. On its own we'd have to
|
||||
spell out all the attributes of each book, including things like `created_at`
|
||||
and `updated_at`. However, by combining it with `have_attributes` matchers, we
|
||||
are able to make the assertion over a subset of each record's attributes.
|
||||
Reference in New Issue
Block a user