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

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

ただいまの
回答率

88.22%

Rails5.1.3, RSpec3.6での ActiveRecord::RecordNotUniqueエラー発生について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,362

koume

score 164

Webアプリケーション制作の勉強中です。RSpecでテストを成功させようとしたら ActiveRecord::RecordNotUniqueが出てしまい
テストが失敗してしまいます。このテストを成功させたくて困っております。テストコードとエラーは以下になります。

テストコード

require 'rails_helper'

describe Staff::AccountsController do
  describe '#update' do
    let(:params_hash) { attributes_for(:staff_member) }
    let(:staff_member) { create(:staff_member) }

    before do
      session[:staff_member_id] = staff_member.id
    end

    example 'email属性を変更する' do
      params_hash.merge!(email: 'test@example.com')
      patch :update, params:{id: staff_member.id, staff_member: params_hash}
      staff_member.reload
      expect(staff_member.email).to eq('test@example.com')
    end

    example '例外ActionController::ParameterMissingが発生' do
      bypass_rescue
      expect { patch :update, params:{id: staff_member.id}} .
        to raise_error(ActionController::ParameterMissing)
    end

    example 'end_dateの値は書き換え不可' do
      params_hash.merge!(end_date: Date.tomorrow)
      expect {
        patch :update, params:{id: staff_member.id, staff_member: params_hash}
      }.not_to change { staff_member.end_date }
    end
  end
end


テストコード実行結果

[vagrant@localhost chibi]$ bin/rspec spec/controllers/staff/accounts_controller_
spec.rb                                                                                                                                                             
Running via Spring preloader in process 16066
.FF

Failures:

  1) Staff::AccountsController#update 例外ActionController::ParameterMissingが発
     生                                                                                                                                                             
     Failure/Error: let(:staff_member) { create(:staff_member) }

     ActiveRecord::RecordNotUnique:
       Mysql2::Error: Duplicate entry 'member3@example.com' for key 'index_staff 
       _members_on_email_for_index': INSERT INTO `staff_members` (`email`, `email_for_i
       ndex`, `family_name`, `given_name`, `family_name_kana`, `given_name_kana`, `hash
       ed_password`, `start_date`, `created_at`, `updated_at`) VALUES ('member3@example
       .com', 'member3@example.com', '山田', '太郎', 'ヤマダ', 'タロウ', '$2a$10$zUoRCk 
       T71mFQ/ZVFNpbFBuAjUWzHTJ.lZJaUnBw0FdFbMMpwIx2XK', '2017-08-14', '2017-08-15 05:0 
       5:04', '2017-08-15 05:05:04')
     # ./spec/controllers/staff/accounts_controller_spec.rb:6:in `block (3 level
s) in <top (required)>'                                                                                                                                                             
     # ./spec/controllers/staff/accounts_controller_spec.rb:9:in `block (3 level
s) in <top (required)>'                                                                                                                                                             
     # -e:1:in `<main>'
     # ------------------
     # --- Caused by: ---
     # Mysql2::Error:
     #   Duplicate entry 'member3@example.com' for key 'index_staff_members_on_e
mail_for_index'                                                                                                                                                             
     #   ./spec/controllers/staff/accounts_controller_spec.rb:6:in `block (3 lev                                                                                                                                                             
els) in <top (required)>'
  2) Staff::AccountsController#update end_dateの値は書き換え不可
     Failure/Error: let(:staff_member) { create(:staff_member) }
.
.
.
.
Finished in 0.42558 seconds (files took 0.616 seconds to load)
3 examples, 2 failures

Failed examples:

rspec ./spec/controllers/staff/accounts_controller_spec.rb:19 # Staff::AccountsC
ontroller#update 例外ActionController::ParameterMissingが発生                                                                                                                                                             
rspec ./spec/controllers/staff/accounts_controller_spec.rb:25 # Staff::AccountsC                                                                                                                                                             
ontroller#update end_dateの値は書き換え不可


上記でテストが失敗していますが、自分で調べてみたら一意性のデータと重複したデータです。みたいな感じでした。
(解釈が間違っているかもしれません。)
let(:staff_member) { create(:staff_member) } のコードでテストが失敗しているようですがテストを成功させるには
どうしたらいいのでしょうか?記述ミスなどあるのでしょうか?どなたか教えてください。宜しくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

0

おそらく全く同じ、書籍を使って学習しています。
自分も、書籍の流れ通りで進めたら、ここでどうしてもテストが通らなくなりました。

もし現時点で、ミスの箇所など心当たりなど教えていただけますと幸いです。

よろしくお願いします。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/17 22:12

    たぶん「実践Ruby on Rails4」だと思いますが、自分もRspecでは悩まされました。teratailで質問しても
    回答が得られない状況でしたのでとりあえず学習をすすめていきP276のspecファイルまで実行した後、
    it_behaves_like 'a protected singular staff controller'をコメントアウトするとテストが通ります。
    参考までに、Railsのバージョンを5以降でインストールしていた場合、Turbolinksも動作しません。
    自分の場合、読者サポートページから著者「黒田さん」に直接質問していき学習を進めました。
    参考にならない回答ですが、直接質問するのがいいと思います。ちなみに1冊では完成しない内容となっているので「拡張機能編」も購入する必要があります。2冊とも実践に沿った複雑な内容なので理解するまで時間を要しました。

    キャンセル

  • 2017/12/17 22:23

    お返事ありがとうございます。
    specのテストは無事、通るようになりました。

    たしかに、本はrails4対応なので、現状に沿ってバージョン5にするには、移行がちょっと大変そうですね。

    拡張機能編の必要性と直接、質問することが可能な点につきましてもありがとうございます。
    心強いアドバイスです!

    キャンセル

check解決した方法

-1

とりあえず学習を進め、他のテストを成功させながら、コードミスのチェックしていったら最後の $ bin/rspec spec/で テストファイルのテストを実行したところ
全てテストが成功しました。たぶん、どこかの単純なスペルミスが原因だったのだと
思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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