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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1151閲覧

コンソールでvalid? => trueとなるのに、テストでfalseが出る

takuma1229

総合スコア11

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/06/09 05:26

前提・実現したいこと

Railsでテストを書いています。(ソースコード下述)
"should be valid"テストのassert @detail.validの部分でテストがfailする(Expected false to be truthy.)のですが、コンソールで全く同じ@detailを作成し@detail.valid?とするとTrueが帰ってきます。

なぜテストが通らないのか教えていただきたいです。

程度の低い質問でしたら申し訳ございません。
また、質問に必要な情報等に不足があれば、お手数ですがご指摘いただければ、追記いたします。

よろしくお願いいたします。

該当のソースコード

ruby

1[detail_test.rb] 2require 'test_helper' 3 4class DetailTest < ActiveSupport::TestCase 5 6 def setup 7 8 9 @detail = Detail.new(user_id: "1", authenticity_token: "dajfisjfjs", mother_tongue: "Japanese", 10 japanese_level: "Beginner | 初心者", english_level: "Beginner | 初心者", 11 region: "Asia | アジア", purpose: "Business | 仕事", 12 self_introduction: "djifjiajfja", gender: "he/him | 男性", 13 sns_1: "djfiasf", sns_2: "jdifdjas", sns_3: "fadiofaj") 14 end 15 16 test "should be valid" do 17 assert @detail.valid? 18 end 19 20 test "mother_tongue should be present" do 21 @detail.mother_tongue = " " 22 assert_not @detail.valid? 23 end 24 25 test "japanese_level should be present" do 26 @detail.japanese_level = " " 27 assert_not @detail.valid? 28 end 29 30 test "english_level should be present" do 31 @detail.english_level = " " 32 assert_not @detail.valid? 33 end 34 35 test "region should be present" do 36 @detail.region = " " 37 assert_not @detail.valid? 38 end 39 40 test "purpose should be present" do 41 @detail.purpose = " " 42 assert_not @detail.valid? 43 end 44 45 test "self_introduction should be present" do 46 @detail.self_introduction = " " 47 assert_not @detail.valid? 48 end 49 50end

ruby

1[detail.rb] 2class Detail < ApplicationRecord 3 belongs_to :user 4 validates :mother_tongue, presence: true 5 validates :japanese_level, presence: true 6 validates :english_level, presence: true 7 validates :region, presence: true 8 validates :purpose, presence: true 9 validates :self_introduction, presence: true, length: {maximum:300} 10end 11

補足情報(FW/ツールのバージョンなど)

Rails 6.0.3
Ruby 2.6.3
AWS Cloud9を使用

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

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

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

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

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

maisumakun

2021/06/09 05:42

> また、質問に必要な情報等に不足があれば、お手数ですがご指摘いただければ、追記いたします。 test環境でのマイグレーションはきちんと行っていますか? (後からマイグレーションを修正したなどの不適切な操作があると、実環境とデータベース構造がずれることもありえます)
takuma1229

2021/06/09 06:03

回答ありがとうございます。 テスト環境でのマイグレーションをやり直してみましたが、改善しませんでした。
guest

回答1

0

ベストアンサー

コンソールで全く同じ@detailを作成し

rails console -e test --sandboxにてtest環境でrails consoleを使えます。
そちらでcreate!して貰えば何が問題かわかるかなと思います。

おそらくですが問題は、user_id: "1"にて、User.find(1)が存在しない可能性があります。

投稿2021/06/09 08:18

asm

総合スコア15147

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

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

takuma1229

2021/06/09 08:54

回答ありがとうございます。 回答していただいた通り、rails consoleで`create!`してみたところ (0.1ms) begin transaction (0.6ms) SAVEPOINT active_record_1 User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] (0.1ms) ROLLBACK TO SAVEPOINT active_record_1 Traceback (most recent call last): 1: from (irb):1 ActiveRecord::RecordInvalid (Validation failed: User must exist) と出てきました。 User.find(1)でも(Couldn't find User with 'id'=1)と出たので、ご指摘の通りUser.find(1)が存在しないようです。 しかし、User.firstと打ち込んだ場合には問題なく表示されます。 User.find(1)とUser.firstの違いと、User.find(1)でユーザーがヒットするようにする方法を教えていただけるととても嬉しいです。 図々しく様々なことを聞いてしまい申し訳ございません。 よろしくお願いいたします。
asm

2021/06/09 09:10

User.find(1): idが1のUser User.first: idが最小のUser 対処法としてはuser_id: "1"ではなく、user: User.firstもしくはuser_id: User.first.idを使う Userを作る時にid指定する事も可能なこともありますが、データベースに依存してきますので避けたいところです
takuma1229

2021/06/09 09:23

ご回答の通り、@detailのuser_idをUser.first.idとしたらうまくいきました! 丁寧に教えてくださり本当にありがとうございます!すごく助かりました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問