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

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

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

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

RSpec

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

Ruby on Rails

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

Q&A

解決済

1回答

3137閲覧

【Rails・RSpec】中間テーブルのモデルのテストが通らない

kumamin

総合スコア12

Ruby

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

RSpec

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/09/29 14:16

前提・実現したいこと

今Railsで制作しているアプリでチャット機能を実装しており、RSpecでモデルの単体テストを行っています。

チャットのグループとユーザーの中間テーブル(group_user)で、同じgroup_idとuser_idが保存されないことをテストしたいのですが、
うまくいかないので解決法を教えていただけますと幸いです。

発生している問題・エラーメッセージ

Failures: 1) GroupUser#create 一つのグループに同じユーザーが2回以上保存されないこと Failure/Error: expect(group_user.errors[:group_id]).to include("はすでに存在します。") expected [] to include "はすでに存在します。" # ./spec/models/group_user_spec.rb:14:in `block (3 levels) in <top (required)>'

該当のソースコード

▼spec/models/group_user_spec.rb

ruby

1require 'rails_helper' 2 3describe GroupUser do 4 describe '#create' do 5 it "一つのグループに同じユーザーが2回以上保存されないこと" do 6 create(:group_user) 7 group_user = create(:group_user) 8 group_user.valid? 9 expect(group_user.errors[:group_id]).to include("はすでに存在します。") 10 end 11 end 12end

▼spec/factories/group_user.rb

ruby

1FactoryBot.define do 2 factory :group_user do 3 group_id {1} 4 user_id {1} 5 group 6 user 7 end 8end

▼app/models/group.rb

ruby

1class Group < ApplicationRecord 2 has_many :group_users, dependent: :destroy 3 has_many :users, through: :group_users 4 has_many :messages, dependent: :destroy 5end

▼app/models/user.rb

ruby

1class User < ApplicationRecord 2 has_many :group_users, dependent: :destroy 3 has_many :groups, through: :group_users 4 has_many :messages, dependent: :destroy 5end

▼app/models/group_user.rb

ruby

1class GroupUser < ApplicationRecord 2 belongs_to :group 3 belongs_to :user 4 validates_uniqueness_of :group_id, scope: :user_id 5end

試したこと

コンソールでテストと同じことを試した結果、ターミナルでは以下のように表示されました。
この結果とコードを見比べてみたのですが、間違いがわかりませんでした。
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

create(:group_user) group_user = create(:group_user)

正常であれば、ここの2回目のcreateがValidationで引っかかって進めなかったような気がしています。

FactoryBotのUserとGroupがあればgroup_userのFactoryBotは以下のようにして

FactoryBot.define do factory :group_user do group user end end

group_user_spec.rbでは2回目のValidationの検査にはbuildを使うのがいいと思います。
たとえば以下のようにして動かないかなと思っています。

describe '#create' do let(:user) { create(:user) } let(:group) { create(:group) } let!(:group_user { create(:group_user, user: user, group: group) } it "一つのグループに同じユーザーが2回以上保存されないこと" do group_user = build(:group_user, user: user, group: group) group_user.valid? expect(group_user.errors[:group_id]).to include("はすでに存在します。") end end

投稿2020/09/30 02:16

hatsu

総合スコア1809

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

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

kumamin

2020/09/30 02:55

おかげさまで解決できました。 letを今まで使ったことがなかったので、このように使うのかと、大変勉強になりました。 ご丁寧にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問