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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Ruby on Rails

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

ユニットテスト

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

Q&A

解決済

1回答

412閲覧

rails tutorial第7章でActiveRecord::RecordNotFound: Couldn't find User with 'id'=1というエラーが発生しました。

akitaakita

総合スコア2

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Ruby on Rails

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

ユニットテスト

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

0グッド

0クリップ

投稿2021/11/08 16:43

rails tutorial第7章のエラーです。

現在rails tutorial第7章のUserのsignup統合テストを
vueとrailsのAPIモードを使って勉強中です。

userテーブルには
・id
・name
・email
・created_at
・updated_at
・password_digest
・gravatar_id
の合計7つのカラムがあります。

usersコントローラーは以下の通りです。

class UsersController < ApplicationController def show user = User.find(params[:id]) render json: user end def create gravatar_id = Digest::MD5::hexdigest(user_params[:email].downcase) gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}" user = User.new(name: user_params[:name], email: user_params[:email], password: user_params[:password], password_confirmation: user_params[:confirmation], gravatar_id: gravatar_url) if user.save render json: user else render json: user.errors.full_messages end end private def user_params params.permit(:name, :email, :password, :confirmation) end end

上記のコードのテストをするため以下のような統合テストで,

  1. create_actionでuserが新しく登録できているか
  2. 新しく登録したuserの詳細ページにアクセスできるか

を確認しようとしたところ、2を実行しようとしたところエラーが発生しました。

require "test_helper" class UsersSignupTest < ActionDispatch::IntegrationTest test "create_actionでuserが新しく登録できているか" do get 'http://localhost:8080/signup'  assert_difference 'User.count', 1 do post users_path, params: { name: "hoge", email: "hoge@example.com", password: "foobar", confirmation: "foobar" } end end  test "新しく登録したuserの詳細ページにアクセスできるか" do post users_path, params: { name: "hoge", email: "hoge@example.com", password: "foobar", confirmation: "foobar" } get 'http://localhost:8080/users/1' //ユーザーの詳細ページ end end

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

UsersSignupTest#test_sucess_signup_information: ActiveRecord::RecordNotFound: Couldn't find User with 'id'=1 app/controllers/users_controller.rb:8:in `show' test/integration/users_signup_test.rb:20:in `block (2 levels) in <class:UsersSignupTest>' test/integration/users_signup_test.rb:18:in `block in <class:UsersSignupTest>'

上記のようなエラーコードとなっており、idが1のユーザーが見つかりませんと怒られている状態です。

試したこと

ブラウザにてユーザー登録を行い'http://localhost:8080/users/1’(ユーザーの詳細ページ)にアクセスしたところ、id=1の情報を取得できていました。

補足情報

バージョン情報
Rails 6.1.4.1
@vue/cli 4.5.13

また、以下のようなメソッドを用いてユーザー登録のリクエストを送っています。

<template> <!-- title --> <!-- error_message --> <!-- form --> <!-- submit button --> </template> <script> import axios from 'axios'; export default { data () { return { user: { name: '', email: '', password: '', confirmation: '' }, errors: '', } }, methods: { //このメソッドでusersコントローラのcreateアクションを起動しています。 signup: function() { this.errors = ''; axios .post('http://127.0.0.1:3000/users', this.user) .then(res => { if(res.data.id) { this.$router.push({name: 'UserDetailPage', params: { id: res.data.id } }) }else{ this.errors = res.data } }) } } } </script>

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

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

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

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

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

guest

回答1

0

ベストアンサー

ブラウザーでアクセスしたのは development環境のDBのデータです。
テスト環境のDBに id=1 のものが無いのです。

テスト環境はテストするたびにIDが大きいものが作られていきますので、ID固定でテストすると「それはない」ということになります。

投稿2021/11/08 21:35

winterboum

総合スコア23376

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

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

akitaakita

2021/11/09 05:55

「テスト環境はテストするたびにIDが大きいものが作られていきます」という部分を知りませんでした。 ご回答ありがとうございます!
winterboum

2021/11/09 06:50

テスト の方では都度テスト前の状態(データなし)にしてるのですが、DBのほうがどこまでIDが進んだか、を記憶しているものだから、次に作るときはそこからの出発になってしまいます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問