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

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

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

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

RSpec

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

Ruby on Rails

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

Vagrant

Vagrantは、VirtualBox上の仮想マシンを コマンドラインから作成してくれるソフトウェアです。 ビルド環境など容易に構築が可能です。

Q&A

解決済

2回答

624閲覧

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

koume

総合スコア458

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

RSpec

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

Ruby on Rails

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

Vagrant

Vagrantは、VirtualBox上の仮想マシンを コマンドラインから作成してくれるソフトウェアです。 ビルド環境など容易に構築が可能です。

1グッド

0クリップ

投稿2017/08/15 05:51

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) } のコードでテストが失敗しているようですがテストを成功させるには
どうしたらいいのでしょうか?記述ミスなどあるのでしょうか?どなたか教えてください。宜しくお願いします。

hujuu👍を押しています

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

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

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

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

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

guest

回答2

0

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

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

よろしくお願いします。

投稿2017/12/15 12:39

hujuu

総合スコア14

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

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

koume

2017/12/17 13:12

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

2017/12/17 13:23

お返事ありがとうございます。 specのテストは無事、通るようになりました。 たしかに、本はrails4対応なので、現状に沿ってバージョン5にするには、移行がちょっと大変そうですね。 拡張機能編の必要性と直接、質問することが可能な点につきましてもありがとうございます。 心強いアドバイスです!
guest

0

自己解決

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

投稿2017/08/17 00:59

koume

総合スコア458

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問