mirror of
https://github.com/jbranchaud/til
synced 2026-01-06 08:38:01 +00:00
Add Test For A Subset Of Attributes On A Model as a Rails TIL
This commit is contained in:
38
rails/test-for-a-subset-of-attributes-on-a-model.md
Normal file
38
rails/test-for-a-subset-of-attributes-on-a-model.md
Normal file
@@ -0,0 +1,38 @@
|
||||
# Test For A Subset Of Attributes On A Model
|
||||
|
||||
Let's say you are using RSpec to test some code that creates or updates an
|
||||
ActiveRecord object. To evaluate that the code is working, you want to check
|
||||
the value of a couple different attributes. Though you could have a series of
|
||||
assert statements to check each value, you may want to combine them into a
|
||||
single statement.
|
||||
|
||||
```ruby
|
||||
book = process_that_updates_book(params)
|
||||
|
||||
expect(book.attributes).to match(
|
||||
"title" => 'Updated title',
|
||||
"publication_year" => 2001,
|
||||
# ... you have to check *every* attribute
|
||||
)
|
||||
```
|
||||
|
||||
The `#match` matcher requires that every attribute in the hash matches. We
|
||||
don't really care to check the `created_at`, `updated_at`, and other irrelevant
|
||||
attributes.
|
||||
|
||||
Instead, we can `match` on
|
||||
[`hash_including`](https://rubydoc.info/gems/rspec-mocks/RSpec%2FMocks%2FArgumentMatchers:hash_including).
|
||||
Additionally, we can `symbolize_keys` on the `attributes` to make the expected
|
||||
data a little cleaner.
|
||||
|
||||
```ruby
|
||||
book = process_that_updates_book(params)
|
||||
|
||||
expect(book.attributes).to match(hash_including(
|
||||
title: 'Updated title',
|
||||
publication_year: 2001,
|
||||
))
|
||||
```
|
||||
|
||||
If the specified attributes match, then the expectation will pass. If at least
|
||||
one of them doesn't, then it will fail. All other attributes are ignored.
|
||||
Reference in New Issue
Block a user