🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

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

RSpec

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

Ruby on Rails

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

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

Q&A

解決済

1回答

3477閲覧

rails: request specの書き方について

nanase21

総合スコア144

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

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

RSpec

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

Ruby on Rails

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

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

0グッド

1クリップ

投稿2019/10/13 06:50

編集2019/10/13 10:58

requst specのupdateの書き方を知りたい。

gem deviseを使用しています。

実際のコード

ruby

1 def update 2 current_user.update(update_params) 3 redirect_to root_path 4 rescue StandardError 5 redirect_to root_path 6 end 7 8 private 9 def update_params 10 params.require(:user).permit(:lastname, :firstname, :tell, :sex, :birth_date, :user_type_id, :image) 11 end 12

ruby

1FactoryBot.define do 2 factory :user do 3 email { 'hoge@mail.com'} 4 password { 'password' } 5 password_confirmation { 'password' } 6 accepted { true } 7 promotion_code { '12345' } 8 confirmed_at { Date.today } 9 end 10end 11

ruby

1requests/users_spec.rb 2RSpec.describe "Users", type: :request do 3 let(:user) { create(:user, id: 1) } 4 5 6 describe "PATCH / user_path" do 7 context 'パラメータで正の時' do 8 let(:params_success) { { user: { lastname: 'last_name', firstname: 'first_name', tell: '09099998888', sex: '男性', birth_date: '2000-02-21', user_type_id: 1, image: '' } } } 9 10 it 'リクエストが成功すること' do 11 patch '/users/' + user.id.to_s, params: params_success 12 expect(User.find_by(id: user.id).firstname).to eq 'first_name' 13 end 14 end 15 end 16end

結果>

  • expected: first_name
  • got: nil

困っていること

patchでレコードを更新しているはずなのに、中身が空のままでテストが落ちてしまう。

test.log

1 2  (0.4ms) SET NAMES utf8 COLLATE utf8_general_ci, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 3  (0.4ms) SELECT `ar_internal_metadata`.`value` FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'schema_sha1' 4  (0.3ms) SET NAMES utf8 COLLATE utf8_general_ci, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 5  (0.3ms) SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC 6  (0.4ms) BEGIN 7  (0.4ms) SAVEPOINT active_record_1 8 User Exists? (0.4ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'hoge@mail.com' LIMIT 1 9 User Create (0.7ms) INSERT INTO `users` (`id`, `email`, `encrypted_password`, `confirmed_at`, `created_at`, `updated_at`, `accepted`, `promotion_code`) VALUES (1, 'hoge@mail.com', '$2a$04$4bYXcGJzKQDHBEvXzzzbSulv3URSCxygq6dJNtTshhAY199MNvFG6', '2019-10-13 00:00:00', '2019-10-13 10:57:06.721754', '2019-10-13 10:57:06.721754', TRUE, '12345') 10  (0.4ms) RELEASE SAVEPOINT active_record_1 11Started PATCH "/users/1" for 127.0.0.1 at 2019-10-13 10:57:06 +0000 12  (0.5ms) SAVEPOINT active_record_1 13 User Update (0.5ms) UPDATE `users` SET `users`.`sign_in_count` = 1, `users`.`current_sign_in_at` = '2019-10-13 10:57:06', `users`.`last_sign_in_at` = '2019-10-13 10:57:06', `users`.`current_sign_in_ip` = '127.0.0.1', `users`.`last_sign_in_ip` = '127.0.0.1', `users`.`updated_at` = '2019-10-13 10:57:06.738645' WHERE `users`.`id` = 1 14  (0.3ms) RELEASE SAVEPOINT active_record_1 15Processing by UsersController#update as HTML 16 Parameters: {"user"=>{"id"=>"1", "lastname"=>"last_name", "firstname"=>"first_name", "tell"=>"09088997766", "sex"=>"男性", "birth_date"=>"1996-04-21", "user_type_id"=>"1", "image"=>""}, "id"=>"1"} 17 User Load (0.6ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 18Unpermitted parameter: :id 19  (0.3ms) SAVEPOINT active_record_1 20 User Update (0.4ms) UPDATE `users` SET `users`.`updated_at` = '2019-10-13 10:57:06.770118', `users`.`firstname` = 'first_name', `users`.`lastname` = 'last_name', `users`.`tell` = '09088997766', `users`.`sex` = '男性', `users`.`birth_date` = '1996-04-21', `users`.`user_type_id` = 1 WHERE `users`.`id` = 1 21 ActiveStorage::Blob Load (0.5ms) SELECT `active_storage_blobs`.* FROM `active_storage_blobs` INNER JOIN `active_storage_attachments` ON `active_storage_blobs`.`id` = `active_storage_attachments`.`blob_id` WHERE `active_storage_attachments`.`record_id` = 1 AND `active_storage_attachments`.`record_type` = 'User' AND `active_storage_attachments`.`name` = 'image' LIMIT 1 22  (0.4ms) ROLLBACK TO SAVEPOINT active_record_1 23Redirected to http://www.example.com/users/1/profile 24Completed 302 Found in 31ms (ActiveRecord: 4.1ms | Allocations: 15462) 25  (1.1ms) ROLLBACK

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

test.log 側に、PATCHリクエストを送信した時のログが出ていると思います。

  • テストの際に送信されているリクエストパラメータ
  • developmentモード&ブラウザで想定操作をした際のリクエストパラメータ

を比べてみてはいかがでしょうか?
うまくリクエストが通っていれば、developmentモードと同じように、PATCH操作によってUPDATEのSQLが走ります。
バリデーションエラーや権限エラーであれば、たぶん同様にログが出ていると思います。

また、PATCHのリクエストにあたっては、認証が必要でしょうか?
deviceを使っていらっしゃるので、もし認証が必要な操作なら、サインイン状態になっていないといけないかな?と思います。

expect(User.find_by(id: user.id).firstname).to eq 'first_name'

のところを、いったん

expect(response).to have_http_status(302)

としてみて、ステータスコードを確認してみてはいかがでしょう。

投稿2019/10/13 07:42

suama

総合スコア1997

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

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

nanase21

2019/10/13 11:00

ご教示いただきありがとうございます。 ご指摘通り、userはfactorybotで作ってもログインはしていませんでした。 なので、request spec用にsign_in helperを作成し、再度試してみたのですが、やはり上手くいきませんでした。 test.logをアップしたのでもし原因がお分かりであればご教示いただけると幸いです。
suama

2019/10/13 13:23

ログを見ると、「Unpermitted parameter: :id」というエラーが出ていますね。 String Parameterの設定を見てみるとよいのでは。 developmentモードで画面からリクエストを出した時のパラメータと、比較してみてくださいね。 テストだと、 Parameters: {"user"=>{"id"=>"1", "lastname"=>"last_name", "firstname"=>"first_name", "tell"=>"09088997766", "sex"=>"男性", "birth_date"=>"1996-04-21", "user_type_id"=>"1", "image"=>""}, "id"=>"1"} というパラメータになっています。ここに、"id" が入っていますので、その辺を確認すればいいのかなと。 認証の件は大丈夫そうですが、deviseのドキュメントも添えておきますね。 https://github.com/plataformatec/devise/wiki/How-To:-sign-in-and-out-a-user-in-Request-type-specs-(specs-tagged-with-type:-:request)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問