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

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

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

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

RSpec

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

Q&A

解決済

1回答

1280閲覧

いいね機能の統合テストをRSpecで実装したい。

AkiDatsugoku26

総合スコア35

Ruby on Rails 6

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

RSpec

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

0グッド

0クリップ

投稿2021/12/07 08:22

前提・実現したいこと

表題の通りです。
ログイン→詳細ページ→unlikeボタン(いいね数0の状態)を押すと→likesカウントが1増えるという状況を想定しています。

ローカルの画面上では上手くいっているのですが、なぜかunlikeをしてもlikesカウントが0のままのようで原因を特定できず困っています。
着目した方が良いポイントや必要な情報などありましたら是非教えてください。

Failure/Error: expect(@article.likes.count).to eq(1) expected: 1 got: 0

該当のソースコード

**詳細ページ** <div id="article_<%= @article.id %>"> <% if logged_in? %> <% if @current_user.liked_by?(@article.id) && %> <td> <%= link_to destroy_like_path(@article), class: "like-link", method: :DELETE, remote: true do %> <i class="fa fa-heart like-btn"></i> <% end %> </td> <% else %> <td> <%= link_to create_like_path(@article), class: "like-link", method: :POST, remote: true do %> <i class="fa fa-heart unlike-btn"></i> <% end %> </td> <% end %> <%= @article.likes.count %> <% end %> </div>

features

1require 'rails_helper' 2 3RSpec.describe "Likes", type: :feature do 4 before do 5 @article = FactoryBot.create(:article) 6 end 7 8 describe '#create,#destroy' do 9 it 'can do goot button any article' do 10 sign_in(@article.user) 11 visit article_path(@article.id) 12 find('.unlike-btn').click 13 expect(@article.likes.count).to eq(1) 14 end 15 end 16end

FactoryBot

1**articleのテストデータ** 2 3FactoryBot.define do 4 factory :article do 5 association :user 6 sequence(:title) { |n| "Title #{n}" } 7 content "text" 8 category "anime" 9 10 after(:build) do |article| 11 article.image.attach(io: File.open("spec/fixtures/files/sample.jpg"), filename: 'sample.jpg', content_type: 'image/jpg') 12 end 13 end 14end

support

1module SignInSupport 2 def sign_in(user) 3 visit root_path 4 5 click_link "ログイン" 6 fill_in "user[email]", with: user.email 7 fill_in "user[password]", with: user.password 8 find('input[name="commit"]').click 9 10 expect(current_path).to eq(root_path) 11 end 12end 13 14RSpec.configure do|config| 15 config.include SignInSupport 16end

いいね機能のコード

stylesheet

1.like-link { 2 text-decoration: none!important; 3} 4 5.like-link:hover { 6 background-color: #fff!important; 7} 8 9.like-btn { 10 font-size: 15px; 11 color: #808080; 12} 13 14.unlike-btn { 15 font-size: 15px; 16 color: #e54747; 17}
**create.js destory.js** document.getElementById('article_<%= @article.id %>').innerHTML = '<%= j(render @article) %>'

補足情報(FW/ツールのバージョンなど)

rails -v 6.0.0
ruby -v 2.6.3
RSpec -v 3.10

現状の統合テストはこちらの記事を参照しています
https://qiita.com/narimiya/items/477e30fe9a3aeb747282

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

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

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

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

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

guest

回答1

0

ベストアンサー

コードを見る限り、「いいね!」ボタンはAjaxで動作しているようです。なので、テストコードは実際のブラウザを動かしてテストする必要があります。(慣習として、その場合はjs: trueのフラグを付けることが多いです)

「Everyday Rails - RSpecによるRailsテスト入門」をお持ちであれば、6章の「JavaScriptを使った操作をテストする」以降の内容が参考になると思います。

ただし、使用しているライブラリ等が若干古いかもしれないので、ライブラリのバージョンや設定ファイルの設定内容等はここ最近の情報を参考にするのが良いと思います。

僕のGitHubリポジトリにも最近のライブラリを使う場合のコード例があるので、こちらも参考にしてみてください。

https://github.com/JunichiIto/everydayrails-rspec-2017/pull/4

投稿2021/12/07 09:15

jnchito

総合スコア357

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

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

AkiDatsugoku26

2021/12/07 11:33

すぐにご回答いただきありがとうございます! まさか伊藤さんからご回答いただけるとは思っていなかったので驚きました。 まずは「Everyday Rails - RSpecによるRailsテスト入門」の6章を見直してみます。 またGitHubリポジトリまでありがとうございます。こちらも参照してみます。 まだまだRSpec慣れませんがやっているうちにその必要性は実感しているので挫けず頑張ってみます!
AkiDatsugoku26

2021/12/08 01:43

こちら上記の助言を頼りに作業してみたところ上手くいきました。 僕の場合はRSpecをブラウザ上でうごかす為に  ① gem 'webdrivers'をインストール ② $ curl https://intoli.com/install-google-chrome.sh | bashでグーグルクロームをインストール ③記載した詳細ページ(show)のlike-btnとunlike-btnを入れ替える <td> <%= link_to destroy_like_path(@article), class: "like-link", method: :DELETE, remote: true do %> <i class="fa fa-heart unlike-btn"></i> <% end %> </td> <% else %> <td> <%= link_to create_like_path(@article), class: "like-link", method: :POST, remote: true do %> <i class="fa fa-heart like-btn"></i> <% end %> </td> ④統合テストを書き直す require 'rails_helper' require 'capybara/rspec' RSpec.describe "Likes", type: :feature do scenario "can do goot button any article", js: true do @article = FactoryBot.create(:article) sign_in(@article.user) visit article_path(@article.id) find('.like-btn').click sleep 0.5 expect(page).to have_selector '.unlike-btn' expect(@article.likes.count).to eq(1) find('.unlike-btn').click sleep 0.5 expect(page).to have_selector '.like-btn' expect(@article.likes.count).to eq(0) end end 上記で上手くいきました。ポイントはlike-btnとunlike-btnのクリックをする際にsleepを使用していることです。この記述がないとテストが成功したり失敗したりしたので僕の場合こうすることで上手くいきました。 理由については下記記事がおすすめです https://qiita.com/eitches/items/eee0d0502ee65feb6fa2 以上です。 いいね機能については実装の手順はありますがRSpecの検証までをやっている記事は少なかったため同じ状況の方のお役に立てれば嬉しいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問