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

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

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

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

RSpec

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

Ruby on Rails

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

Q&A

解決済

1回答

2451閲覧

いいねが成功しない Rspec

ko-u

総合スコア61

Ruby

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

RSpec

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

Ruby on Rails

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

0グッド

0クリップ

投稿2018/12/26 03:36

編集2018/12/27 08:27

Ruby初学者です。
現在Rspecでポートフォリオのテストを書いています。

ご教授頂けますと幸いです。

【実現したいこと】
likes_controller_specのテストを通したい

【困っていること】
ブラウザ上ではいいねが反応するのですが、テストが通りません。

デバッガを差し込んでみてもlikes_controllerlikes_cotroller_specのどちらも値が入っていることを確認しています。

likes_controller_spec

require 'rails_helper' RSpec.describe LikesController, type: :controller do let!(:user) { create(:user) } let!(:post1) { create(:post, user: user) } let!(:like) { create(:like, user_id: user.id, post_id: post1.id) } describe "#create" do before do sign_in user end it "Ajexが反応する" do post :create, format: :js, params: { post_id: post1.id, id: like.id } expect(response.content_type).to eq 'text/javascript' end it "いいねに成功する" do expect { post :create, format: :js, params: { post_id: post1.id, id: like.id } }.to change(Like, :count).by(1) end end describe "#destroy" do before do sign_in user end it "Ajexが反応する" do delete :destroy, format: :js, params: { post_id: post1.id, user_id: user.id, id: like.id } expect(response.content_type).to eq 'text/javascript' end it "いいねの削除に成功する" do expect { delete :destroy, format: :js, params: { post_id: post1.id, user_id: user.id, id: like.id } }.to change(Like, :count).by(-1) end end end

エラー内容

Failure/Error: expect { post :create, format: :js, params: { post_id: post1.id, user_id: user.id } }.to change(Like, :count).by(1) expected #count to have changed by 1, but was changed by 0

likes_controller.rb

class LikesController < ApplicationController def create @like = current_user.likes.find_or_create_by(post_id: params[:post_id]) @likes = Like.where(post_id: params[:post_id]) @post = Post.find(params[:post_id]) end

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

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

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

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

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

guest

回答1

0

ベストアンサー

changeマッチャですがブレースで囲えばテスト成功しませんか?(未検証)

change(Like, :count).by(1) ↓ change{ Like, :count }.by(1)

投稿2018/12/26 08:18

hn_15

総合スコア17

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

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

ko-u

2018/12/26 08:31

シンタックスエラーになってしまいました・・
hn_15

2018/12/26 08:52 編集

構文がダメなんですね。 change{ Like.count }.by(1) これでどうでしょうか?
hn_15

2018/12/26 09:32

すみません。 良くソースを見たら、このテストが行いたいのはLikesテーブルにレコードが出来る事を期待しているテストなんですね。。 であれば let!(:like) { create(:like, user_id: user.id, post_id: post1.id) } 上記で先にレコードが作られているので、insertは行われず該当テストは変更無し(change.by 0)となっている可能性が高そうです。
ko-u

2018/12/27 08:24

いいねを解除するテスト(destroy)の方は受け渡しができているんですよね・・・
hn_15

2019/01/08 03:48

テストの前提条件を再度見直して下さい。(おそらく以下のような仕様だと想定) 1. いいねの解除とはLikesテーブルからレコードを削除するので削除対象のレコードが必要になる。 2. いいねを行う処理は ログインユーザーが対象のpostに対していいねを行っていない場合にレコードが生成される。(find_or_create_by の挙動をドキュメントで確認して下さい) let!(:like) { create(:like, user_id: user.id, post_id: post1.id) } ↑この記述を destroy以下に移動すると成功しませんか? そして createでは like.idが不必要に見えますね。。 これでだめなら binding.pry などでデバッグするのが解決の一番の近道だと思います。
ko-u

2019/01/09 06:28

destroyに移動させcreateに受け渡す値を変えたところ、テストが通りました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問