From 984c4c2d407076dda4c0f20615fb1d14da2e3113 Mon Sep 17 00:00:00 2001 From: jbranchaud Date: Fri, 18 Oct 2019 14:34:32 -0500 Subject: [PATCH] Add Check Specific Attributes On ActiveRecord Array as a rails til --- README.md | 3 +- ...ecific-attributes-on-activerecord-array.md | 31 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 rails/check-specific-attributes-on-activerecord-array.md diff --git a/README.md b/README.md index 1957238..98d630a 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ smart people at [Hashrocket](http://hashrocket.com/). For a steady stream of TILs from a variety of rocketeers, checkout [til.hashrocket.com](https://til.hashrocket.com/). -_854 TILs and counting..._ +_855 TILs and counting..._ --- @@ -500,6 +500,7 @@ _854 TILs and counting..._ - [Capybara Page Status Code](rails/capybara-page-status-code.md) - [Cast Common Boolean-Like Values To Booleans](rails/cast-common-boolean-like-values-to-booleans.md) - [Change The Nullability Of A Column](rails/change-the-nullability-of-a-column.md) +- [Check Specific Attributes On ActiveRecord Array](rails/check-specific-attributes-on-activerecord-array.md) - [Code Statistics For An Application](rails/code-statistics-for-an-application.md) - [Conditional Class Selectors in Haml](rails/conditional-class-selectors-in-haml.md) - [Convert A Symbol To A Constant](rails/convert-a-symbol-to-a-constant.md) diff --git a/rails/check-specific-attributes-on-activerecord-array.md b/rails/check-specific-attributes-on-activerecord-array.md new file mode 100644 index 0000000..87fe95f --- /dev/null +++ b/rails/check-specific-attributes-on-activerecord-array.md @@ -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.