質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

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

RSpec

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

Ruby on Rails

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

テスト駆動開発

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

2473閲覧

Rspec コントローラ、indexアクションのインスタンス変数@postsのテストでassigns(:posts)の中身が空の配列になっておりテストがうまく通らない。

amachan1234

総合スコア7

Ruby

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

RSpec

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

Ruby on Rails

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

テスト駆動開発

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/01/07 18:10

posts_controllerのindexアクションのインスタンス変数@postsのテストを行なっています。
しかし、assigns(:posts)で上手く値を渡せず?中身が空の配列になっておりテストが通りません。
初歩的なことかもしれませんが何が起きているかさっぱりわからず困っています。
何か心当たりなどありましたらご教授お願いいたします。

現在の状態でテストを走らせると表示されるエラーメッセージ

1) PostsController#index created_at ascで並べ替えられたpostの配列 Failure/Error: expect(assigns(:posts)).to match(posts.sort{|a, b| a.created_at <=> b.created_at }) expected #<ActiveRecord::Relation []> to match [#<Post id: 235, title: "松田", address: "東京駅", image: "sample_image.jpg", content: "aaaaaaaaaaaaaaa", user_id: 347, created_at: "2020-01-05 20:52:44", updated_at: "2020-01-07 17:44:33", latitude: 35.6806303, longitude: 139.7687578>, #<Post id: 233, title: "杉山", address: "東京駅", image: "sample_image.jpg", content: "aaaaaaaaaaaaaaa", user_id: 345, created_at: "2020-01-05 22:52:05", updated_at: "2020-01-07 17:44:30", latitude: 35.6806303, longitude: 139.7687578>, #<Post id: 234, title: "池田", address: "東京駅", image: "sample_image.jpg", content: "aaaaaaaaaaaaaaa", user_id: 346, created_at: "2020-01-06 00:17:40", updated_at: "2020-01-07 17:44:32", latitude: 35.6806303, longitude: 139.7687578>] Diff: @@ -1,4 +1,2 @@ -[#<Post id: 235, title: "松田", address: "東京駅", image: "sample_image.jpg", content: "aaaaaaaaaaaaaaa", user_id: 347, created_at: "2020-01-05 20:52:44", updated_at: "2020-01-07 17:44:33", latitude: 35.6806303, longitude: 139.7687578>, - #<Post id: 233, title: "杉山", address: "東京駅", image: "sample_image.jpg", content: "aaaaaaaaaaaaaaa", user_id: 345, created_at: "2020-01-05 22:52:05", updated_at: "2020-01-07 17:44:30", latitude: 35.6806303, longitude: 139.7687578>, - #<Post id: 234, title: "池田", address: "東京駅", image: "sample_image.jpg", content: "aaaaaaaaaaaaaaa", user_id: 346, created_at: "2020-01-06 00:17:40", updated_at: "2020-01-07 17:44:32", latitude: 35.6806303, longitude: 139.7687578>] +[] # ./spec/controllers/posts_controller_spec.rb:13:in `block (3 levels) in <top (required)>'

binding.pryでassigns(:posts)を確認

8: 9: describe '#index' do 10: 11: it "created_at ascで並べ替えられたpostの配列" do 12: get :index => 13: binding.pry 14: expect(assigns(:posts)).to match_array posts 15: end 16: 17: 18: [1] pry(#<RSpec::ExampleGroups::PostsController::Index>)> assigns(:posts) => []

posts_controller_spec.rb

require 'rails_helper' describe PostsController do let(:user) { create(:user) } let(:posts) { create_list(:post, 3) } describe '#index' do it "created_at ascで並べ替えられたpostの配列" do get :index expect(assigns(:posts)).to match(posts.sort{|a, b| a.created_at <=> b.created_at }) end end end

posts_controller.rb

def index @posts = Post.all.order("created_at asc").page(params[:page]).per(12) end

spec/factories/posts.rb

FactoryBot.define do factory :post do title {Faker::Name.last_name} address {'東京駅'} image { Rack::Test::UploadedFile.new(Rails.root.join('spec/support/sample_image.jpg'), 'image/jpeg') } content {'aaaaaaaaaaaaaaa'} latitude {35.6959} longitude {139.702} created_at { Faker::Time.between(from: DateTime.now - 2, to: DateTime.now) } user end end

環境

Rails 5.0.7.2
ruby 2.5.1
rspec-rails (3.9.0)

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

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

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

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

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

guest

回答1

0

ベストアンサー

let(:posts) { create_list(:post, 3) }

let!(:posts) { create_list(:post, 3) }
にしてみてください。

let(:posts) { create_list(:post, 3) }

ですと、it の中で posts が呼ばれた時点でcreateされます。
今のtest code ではgetまでに呼ばれていないので、Postはありません
let! にするとその時点でcreateされます

投稿2020/01/08 00:22

winterboum

総合スコア23331

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

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

amachan1234

2020/01/08 05:17

ご回答ありがとうございます! 直してみたところ無事うまく通りました。 letについて今一度学習してみます。 助かりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問