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

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

ただいまの
回答率

87.59%

spec 結合テストについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 483

score 34

spec system結合テストにてバリデーションにユーザーを入れてとの指示が消えません
beforeのところに
@user = FactoryBot.create(:user)

を入れてもダメでした、、

エラー文

   9) 本詳細 ログインしていない状態で本詳細ページに遷移できるもののコメント投稿欄が表示されない
     Failure/Error: @book = FactoryBot.create(:book)

     ActiveRecord::RecordInvalid:
       バリデーションに失敗しました: Userを入力してください
テスト

RSpec.describe '本編集', type: :system do
  before do
    @book1 = FactoryBot.create(:book)
    @book2 = FactoryBot.create(:book)
  end
  context '本編集ができるとき' do
    it 'ログインしたユーザーは自分が投稿した本の編集ができる' do
       # 本1を投稿したユーザーでログインする
      visit new_user_session_path
      fill_in 'user_email', with: @user.email
      fill_in 'user_password', with: @user.password
      find('input[name="commit"]').click
      expect(current_path).to eq root_path
      # 編集ページへ遷移する
      visit edit_book_path(@book)
      # 投稿内容を編集する
       fill_in 'book_image', with: "#{@book.image}+編集した画像URL"
       fill_in 'book_text', with: "#{@book.text}+編集したテキスト"
      # 編集してもbookモデルのカウントは変わらない
      expect{
        find('input[name="commit"]').click
      }.to change { book.count }.by(0)
      # 編集完了画面に遷移する
      expect(current_path).to eq book_path(@book)
      # 「更新が完了しました」の文字がある
      expect(page).to have_content('更新が完了しました。')
      # トップページに遷移する
      visit root_path
      # トップページには先ほど変更した内容の本が存在する(画像)
      expect(page).to have_selector ".content_post[style='background-image: url(#{@book.image}+編集した画像URL);']"
      # トップページには先ほど変更した内容の本が存在する(テキスト)
      expect(page).to have_content("#{@book.text}+編集したテキスト")
    end
  end
require 'rails_helper'

RSpec.describe 'ユーザー新規登録', type: :system do
  before do
    @user = FactoryBot.build(:user)
  end
  context 'ユーザー新規登録ができるとき' do 
    it '正しい情報を入力すればユーザー新規登録ができてトップページに移動する' do
      # トップページに移動する
      visit root_path
      # 新規登録ページへ移動する
      visit new_user_registration_path
      # ユーザー情報を入力する
      fill_in 'user_nickname', with: @user.nickname
      fill_in 'user_email', with: @user.email
      fill_in 'user_password', with: @user.password

      # トップページへ遷移することを確認する
      expect(current_path).to eq root_path
      # カーソルを合わせるとログアウトボタンが表示されることを確認する
      expect(
        find(".logout")
      ).to have_content('ログアウト')
      # サインアップページへ遷移するボタンやログインページへ遷移するボタンが表示されていないことを確認する
      expect(page).to have_no_content('新規登録')
      expect(page).to have_no_content('ログイン')
    end
  end
  context 'ユーザー新規登録ができないとき' do
    it '誤った情報ではユーザー新規登録ができずに新規登録ページへ戻ってくる' do
      # トップページに移動する
      visit root_path
      # 新規登録ページへ移動する
      visit new_user_registration_path
      # ユーザー情報を入力する
      fill_in 'user_nickname', with: ""
      fill_in 'user_email', with: ""
      fill_in 'user_password', with: ""
      # サインアップボタンを押してもユーザーモデルのカウントは上がらないことを確認する
      expect{
        find('input[name="commit"]').click
      }.to change { User.count }.by(0)
      # 新規登録ページへ戻されることを確認する
      expect(current_path).to eq "/users"
    end
  end
end

RSpec.describe 'ログイン', type: :system do
  before do
    @user = FactoryBot.create(:user)
  end
  context 'ログインができるとき' do
    it '保存されているユーザーの情報と合致すればログインができる' do
      # トップページに移動する
      visit root_path
      # トップページにログインページへ遷移するボタンがあることを確認する
      expect(page).to have_content('ログイン')
      # ログインページへ遷移する
      visit new_user_session_path
      # 正しいユーザー情報を入力する
      fill_in 'user_email', with: @user.email
      fill_in 'user_password', with: @user.password
      # ログインボタンを押す
      find('input[name="commit"]').click
      # トップページへ遷移することを確認する
      expect(current_path).to eq root_path
    end
  end
  context 'ログインができないとき' do
    it '保存されているユーザーの情報と合致しないとログインができない' do
      # トップページに移動する
      visit root_path
      # トップページにログインページへ遷移するボタンがあることを確認する
      expect(page).to have_content('ログイン')
      # ログインページへ遷移する
      visit new_user_session_path
      # ユーザー情報を入力する
      fill_in 'user_email', with: ""
      fill_in 'user_password', with: ""
      # ログインボタンを押す
      find('input[name="commit"]').click
      # ログインページへ戻されることを確認する
      expect(current_path).to eq new_user_session_path
    end
  end
end

本編集画面

<body><div class="container">
<div class="sec1title">
    <h2>*本について編集を加える!*</h2>
  </div>

<%= form_for (@book)  do |f| %>

 <div class="tag-field", id='tag-field'>
     <%= f.label :tag_name, "タグ" %>
     <%= f.text_field :tag_name, placeholder: "検索されやすいキーワードを入れましょう" %>
   </div>
  <div class="field" type="text">
    <%= f.label :name, "本の名前" %><br />
    <%= f.text_field :name %>
  </div>

   <div class="genre" >
    <%= f.label :genre_id, "本のジャンル" %><br />
    <%= f.collection_select(:genre_id,Genre.all,:id,:type,{prompt: "---"},{class:"select-box"}) %>
  </div>
  <div class="form-input">
   <div class="text-image-content">
     <%= f.label :content, "説明文" %><br />
  <%= f.text_area :content, placeholder: "話したい内容について、ご自由にお書きください" , rows: "12" %> 
  </div>
  <br /><br /> 
    <label class="form-image">
      <span class="image-file">画像</span>
      <%= f.file_field :image %>
    </label>
    <div class="image-stage", id="image-list"></div>
  </div>

  <div class="actions">
    <%= f.submit "更新", class: "btn1" %>
  </div>
<% end %>

<%# ホームボタン %>
  <%= render "shared/sidebar" %>

</div>
</body>
books.rb

FactoryBot.define do
  factory :book do
    name { '人間失格' }
    content { '紹介文' }
    genre_id { '5' }
  end
end
user.rb

FactoryBot.define do
  factory :user do
    nickname { 'suzuki' }
    email    { 'example@cmail.com' }
    password { 111111 }
    password_confirmation {password}
  end
end
user.spec.rb

require 'rails_helper'

RSpec.describe 'ユーザー新規登録', type: :system do
  before do
    @user = FactoryBot.build(:user)
  end
  context 'ユーザー新規登録ができるとき' do 
    it '正しい情報を入力すればユーザー新規登録ができてトップページに移動する' do
      # トップページに移動する
      visit root_path
      # 新規登録ページへ移動する
      visit new_user_registration_path
      # ユーザー情報を入力する
      fill_in 'user_nickname', with: @user.nickname
      fill_in 'user_email', with: @user.email
      fill_in 'user_password', with: @user.password

      # サインアップページへ遷移するボタンやログインページへ遷移するボタンが表示されていないことを確認する
      expect(page).to have_no_content('新規登録')
      expect(page).to have_no_content('ログイン')
    end
  end
  context 'ユーザー新規登録ができないとき' do
    it '誤った情報ではユーザー新規登録ができずに新規登録ページへ戻ってくる' do
      # トップページに移動する
      visit root_path
      # 新規登録ページへ移動する
      visit new_user_registration_path
      # ユーザー情報を入力する
      fill_in 'user_nickname', with: ""
      fill_in 'user_email', with: ""
      fill_in 'user_password', with: ""
      fill_in 'user_password', with: ""
      fill_in 'user_password', with: ""
      # サインアップボタンを押してもユーザーモデルのカウントは上がらないことを確認する
      expect{
        find('input[name="commit"]').click
      }.to change { User.count }.by(0)
      # 新規登録ページへ戻されることを確認する
      expect(current_path).to eq "/users"
    end
  end
end

RSpec.describe 'ログイン', type: :system do
  before do
    @user = FactoryBot.create(:user)
  end
  context 'ログインができるとき' do
    it '保存されているユーザーの情報と合致すればログインができる' do
      # トップページに移動する
      visit root_path
      # ログインページへ遷移する
      visit new_user_session_path
      # 正しいユーザー情報を入力する
      fill_in 'user_email', with: @user.email
      fill_in 'user_password', with: @user.password
      # ログインボタンを押す
      find('input[name="commit"]').click
      # トップページへ遷移することを確認する
      expect(current_path).to eq root_path
    end
  end
  context 'ログインができないとき' do
    it '保存されているユーザーの情報と合致しないとログインができない' do
      # トップページに移動する
      visit root_path
      # ログインページへ遷移する
      visit new_user_session_path
      # ユーザー情報を入力する
      fill_in 'user_email', with: ""
      fill_in 'user_password', with: ""
      # ログインボタンを押す
      find('input[name="commit"]').click
      # ログインページへ戻されることを確認する
      expect(current_path).to eq new_user_session_path
    end
  end
end
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hatsu

    2020/08/30 09:36

    spec/factories/books.rbで適切にUserを紐付けている必要があると思われます。
    spec/factories/books.rbとspec/factories/users.rbの中身を記載いただくと回答が得られるかもです。

    キャンセル

  • tomsuma

    2020/08/30 09:40

    ご回答ありがとうございます!
    ただ今載せさせてもらいました!

    キャンセル

回答 1

checkベストアンサー

0

  • User has many books
  • book belongs to User 

の想定で回答します。

以下のようだといかがでしょうか
app/models/user.rb

class User < ApplicationRecord
  has_many :books
end

app/models/book.rb

class Book < ApplicationRecord
  belongs_to :user
end

spec/factories/user.rb

FactoryBot.define do
  factory :user do

    nickname { 'suzuki' }
    email    { 'example@cmail.com' }
    password { 111111 }
    password_confirmation {password}
  end
end

spec/factories/book.rb

FactoryBot.define do
  factory :book do
    association :user #ここでテストデータでユーザーの紐付けを行います
    name { '人間失格' }
    content { '紹介文' }
    genre_id { '5' }
  end
end

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/30 13:41

    できました!
    ありがとうございます!

    キャンセル

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る