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

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

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

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

Ruby on Rails

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

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

Q&A

解決済

1回答

717閲覧

rails test テストが通らない

dfasdf

総合スコア6

Ruby

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

Ruby on Rails

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

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

0グッド

0クリップ

投稿2021/04/15 05:42

編集2021/04/15 05:58

プログラミング初学者です。
rails 6を用いて、投稿機能がついたアプリケーションを開発しています。
モデルにはuser, micropost, relationship, prefecture, splitを使っており、micropostはbelongs_toで、user, prefecture, splitをidで関連づけ、バリテーションも掛けている状況です。

app/models/micropost.rb class Micropost < ApplicationRecord belongs_to :user belongs_to :prefecture belongs_to :split has_one_attached :image default_scope -> { order(created_at: :desc) } validates :user_id, presence: true validates :prefecture_id, presence: true validates :split_id, presence: true validates :content, presence: true, length: { maximum: 140 } validates :image, content_type: { in: %w[image/jpeg image/gif image/png], message: "は有効な画像形式である必要があります" }, size: { less_than: 5.megabytes, message: "は5MB未満である必要があります" } def display_image image.variant(resize_to_limit: [500, 500]) end

現在、micropostにpresence: trueのバリテーションがしっかり掛かっているかをテストするために下記のテストコードを書きました。

test/models/micropost_test.rb require 'test_helper' class MicropostTest < ActiveSupport::TestCase def setup @user = users(:michael) @micropost = @user.microposts.build(prefecture_id: 1, split_id: 1, content: "Lorem ipsum") end test "should be valid" do assert @micropost.valid? end test "user id should be present" do @micropost.user_id = nil assert_not @micropost.valid? end test "prefecture id should be present" do @micropost.prefecture_id = nil assert_not @micropost.valid? end test "split id should be present" do @micropost.split_id = nil assert_not @micropost.valid? end test "content should be present" do @micropost.content = " " assert_not @micropost.valid? end test "content should be at most 140 characters" do @micropost.content = "a" * 141 assert_not @micropost.valid? end test "order should be most recent first" do assert_equal microposts(:most_recent), Micropost.first end end

その後、以下のエラーが表記されました。

FAIL["test_should_be_valid", #<Minitest::Reporters::Suite:0x000055bf9c549898 @name="MicropostTest">, 0.4078576729989436] test_should_be_valid#MicropostTest (0.41s) Expected false to be truthy. test/models/micropost_test.rb:13:in `block in <class:MicropostTest>'

@micropostに渡した引数が正しくないことが原因だと考えているのですが、直す箇所がわからないので、ご教授をお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

validates :user_id, presence: true validates :prefecture_id, presence: true validates :split_id, presence: true validates :content, presence: true, length: { maximum: 140 } validates :image,
なのに
prefecture_id: 1, split_id: 1, content: "Lorem ipsum"
しか与えて居ないからです。user_id と imageも。

投稿2021/04/15 05:47

winterboum

総合スコア23284

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

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

dfasdf

2021/04/15 05:55

回答ありがとうございます。 @user.microposts.buildとしているのですがそれとは別にuser_idを書く必要があるということでしょうか? imageに関してはpresence: trueとしていないのですが、なぜ書く必要があるのでしょうか?
winterboum

2021/04/15 06:19 編集

あ、そかuser_idは不要です。 image は色々条件をつけているので absence True してください。
dfasdf

2021/04/15 06:33 編集

返信ありがとうございます。 absence: trueをimageのバリテーションに追加したのですが、同じエラーとなってしまいました。 予想となってしまうのですが、prefecture_idとsplit_idが上手く与えられていないのかもしれません。 書き方のミスなどはありますでしょうか?
dfasdf

2021/04/16 01:33 編集

やはり、prefecture_idとsplit_idがsetupメソッドの段階で上手く与えられていないことが原因でした。 setupメソッドを def setup @user = users(:michael) @prefecture = Prefecture.first @split = Split.first @micropost = @user.microposts.build(prefecture_id: @prefecture.id, split_id: @split.id, content: "テスト") end とすることで解決いたしました。 回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問