🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

Q&A

解決済

1回答

2273閲覧

RSpec インスタンス変数のテストでエラーが出る

tom000

総合スコア2

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

0グッド

0クリップ

投稿2020/11/30 14:46

現在RSpec、及びfactory_botを使用して記事一覧表示機能のインスタンス変数のテストをしています。
下記の通り、エラーが出てしまいますが、リファレンスや他の方の記事を参照しましたが、何か原因なのか分からず作業が止まってしましました。
恐れ入りますが、何か知見がありましたらご教授お願いいたします。

現在起きているエラー内容

ArticlesController GET #index @articlesに正しい値が入っていること Failure/Error: expect(assigns(:articles)).to match(articles.sort{ |a, b| b.created_at <=> a.created_at } ) expected #<ActiveRecord::Relation [#<Article id: 39, title: "title", content: "content", created_at: "2020-11-...nt: "content", created_at: "2020-11-29 05:49:42", updated_at: "2020-11-30 14:07:15", user_id: 101>]> to match [#<Article id: 38, title: "title", content: "content", created_at: "2020-11-30 04:17:41", updated_at: "2020-11-30 14:07:15", user_id: 102>, #<Article id: 37, title: "title", content: "content", created_at: "2020-11-29 05:49:42", updated_at: "2020-11-30 14:07:15", user_id: 101>, #<Article id: 39, title: "title", content: "content", created_at: "2020-11-28 18:26:23", updated_at: "2020-11-30 14:07:15", user_id: 103>] Diff: @@ -1,4 +1,22 @@ -[#<Article id: 38, title: "title", content: "content", created_at: "2020-11-30 04:17:41", updated_at: "2020-11-30 14:07:15", user_id: 102>, - #<Article id: 37, title: "title", content: "content", created_at: "2020-11-29 05:49:42", updated_at: "2020-11-30 14:07:15", user_id: 101>, - #<Article id: 39, title: "title", content: "content", created_at: "2020-11-28 18:26:23", updated_at: "2020-11-30 14:07:15", user_id: 103>] +[#<Article:0x00007fe661c6b750 + id: 39, + title: "title", + content: "content", + created_at: Sun, 29 Nov 2020 03:26:23 JST +09:00, + updated_at: Mon, 30 Nov 2020 23:07:15 JST +09:00, + user_id: 103>, + #<Article:0x00007fe661c6b688 + id: 38, + title: "title", + content: "content", + created_at: Mon, 30 Nov 2020 13:17:41 JST +09:00, + updated_at: Mon, 30 Nov 2020 23:07:15 JST +09:00, + user_id: 102>, + #<Article:0x00007fe661c6b5c0 + id: 37, + title: "title", + content: "content", + created_at: Sun, 29 Nov 2020 14:49:42 JST +09:00, + updated_at: Mon, 30 Nov 2020 23:07:15 JST +09:00, + user_id: 101>] # ./spec/controllers/articles_controller_spec.rb:30:in `block (3 levels) in <top (required)>'

アソシエーション

//user.rb has_many :articles, dependent: :destroy //article.rb belongs_to :user

articles_controller_spec.rb

describe 'GET #index' do it "@articlesに正しい値が入っていること" do articles = create_list(:article, 3) get :index expect(assigns(:articles)).to match(articles.sort{ |a, b| b.created_at <=> a.created_at } ) end

articles_controller.rb

def index @articles = Article.includes(:user).order(id: "DESC").page(params[:page]).per(10) end

factories/articles.rb

FactoryBot.define do factory :article do title {"title"} content {"content"} created_at { Faker::Time.between(from: DateTime.now - 2, to: DateTime.now) } user end end

factories/users.rb

FactoryBot.define do factory :user do nickname {"abe"} password {"00000000"} password_confirmation {"00000000"} sequence(:email) {Faker::Internet.email} end end

環境

Rails 6.0.3.4
Ruby 2.6.6
rspec-rails 4.0.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

assigns(:articles) がcreates_at の逆順に並んでいます。
controller側かtest側のsort条件が逆になっているのでしょう

投稿2020/11/30 21:36

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tom000

2020/12/01 02:55

ご教授頂いたことを元にコードを見直して見ると、indexアクションではidでソートされているのに対し、testではcreated_atでソートされていることに気付き、コントローラー側をcreated_atでのソートに変更したところ、パスしました。 初めは、どちらも同じ順序になるのでは?と思いましたが、Fakerでのダミーデータはランダムにcreated_atが割り振られるので、Idと同じ順序にならない、と気づきを得ることができました。 この度はご回答いただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問