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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1638閲覧

エラー文の日本語表記に伴いテストコードも日本語表記に書き換えたがうまくいかない

teruan7110

総合スコア5

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/09/25 18:54

前提・実現したいこと

Ruby on Railsを用いてフリーマーケットアプリを作成しています
商品出品においてフォームを正しく記入しないとエラーが出てリダイレクトしエラー文を発行してくれる仕組みになっていてテストコードまで完成させうまくテストまでできました。
ここからが本題なのですが、
ここでgem 'rails-i18n'を使用し英語表記のエラー文を日本語表記に変更しました
そしてテストコードも同様に日本語表記に直したのですがそこでエラーが出てしまいうまくいきません
これを今回解決したいです

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

ターミナル使用時のエラー

1) Item 商品出品 商品出品できない時 itemが空だと出品できない Failure/Error: expect(@item.errors.full_messages).to include('商品の名前を入力してください') expected ["Item can't be blank"] to include "商品の名前を入力してください" # ./spec/models/item_spec.rb:17:in `block (4 levels) in <top (required)>'```

config/application.rbに
『config.i18n.default_locale = :ja』と言う記述も忘れずに行い

ruby

1ja: 2 activerecord: 3 attributes: 4 user: 5 nickname: ニックネーム 6 familyname_kanji: 苗字(漢字) 7 firstname_kanji: 名前(漢字) 8 familyname_katakana: 苗字(カナ) 9 firstname_katakana: 名前(カナ) 10 birthday: 生年月日 11 item: 12 item: 商品の名前 13 image: 画像 14 text: テキスト 15 category_id: カテゴリー 16 status_id: 商品の状態 17 delivery_burden_id: 配送料の負担 18 shipping_origin_id: 発送元の地域 19 arrival_day_id: 発送までの日数 20 price: 価格 21 activemodel: 22 attributes: 23 purchase_house_add: 24 postal_code: 郵便番号 25 shipping_origin_id: 都道府県 26 city: 市区町村 27 address: 番地 28 phone: 電話番号

ja.ymlには上記のように記述しdevise.ja.ymlも忘れず作成しました

item_spec.rb

ruby

1~省略~ 2 3 context '商品出品できない時' do 4 it 'itemが空だと出品できない' do 5 @item.item = nil 6 @item.valid? 7 expect(@item.errors.full_messages).to include('商品の名前を入力してください') 8 end 9 10~省略~

それを踏まえてこのように記述したが先程のターミナルで表示されたエラーが発生してしまいます。

試したこと

自分の記述ミスなども考えエラー文を表示させてからそれをコピペして貼ってみたりしてみたがどうしてもうまくいかなかった、しかし英語表記のエラー文をテストコードで使用するとテストがうまくいきます
日本語表記にしたのですから日本語表記のエラー文でテストができないと意味がありません、ですがどうしてもうまくいかないです。
皆様のお知恵を貸していただけると幸いにございます。

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

rubyバージョン 6.0.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

追記

すいません。日本語訳を見落としていました。
gem 'rails-i18n'とconfig.i18n.default_locale = :jaで大丈夫なはずです。

下記コードであれば動くので試してみてください。

it 'itemが空だと出品できない' do item = Item.new(name:nil) item.valid? expect(item.errors.full_messages).to include('商品の名前を入力してください') end

原因は、ご提示頂いたコードだと、@item.item = nilではなく、@item.name = nilが正解なはずです。


補足情報として、エラーメッセージのテストはあまり行わないことが多いかと思います。
理由として、何らかの理由でエラーメッセージを変更すると、テストをいちいち修正しなければならない、という問題が発生したりするからです。
そのためこちらの方法や下記などでテストするほうが望ましい気がします。

item = Item.new(name:nil) expect(item).to_not be_valid

バリデーションエラーも翻訳して、日本語にしてはいかがでしょうか?

投稿2020/09/25 21:53

編集2020/09/26 05:24
no1knows

総合スコア3365

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

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

teruan7110

2020/09/26 04:27

バリデーションエラーも翻訳して、日本語にしてはとはどういうことでしょうか? 自分なりにも調べてみたのですが言葉どうりに受け取るのであれば出品フォームでの入力ミスでクライアント側に見せるエラー文はしっかり日本語化できています。 しかしテストコードで ``` ~省略~ context '商品出品できない時' do it 'itemが空だと出品できない' do @item.item = nil @item.valid? expect(@item.errors.full_messages).to include('商品の名前を入力してください') end ~省略~ ``` と記入すると expect(@item.errors.full_messages).to include('商品の名前を入力してください') の@item.errors.full_messagesの部分がなぜか英語表記でエラー文を出しているみたいで実際に表示される日本語表記のエラー文がマッチしない状態になってしまっているのです。 今回日本語表記でエラー文を出しているのでそれでマッチさせたいのですがどうしてもうまくいかないのです。 説明が足りなかったかもしれません申し訳ないです
teruan7110

2020/09/26 15:56

ありがとうございました! 二つ目に教えていただいたテストの仕方でうまくいきました! しかし上記に教えていただいた方法ではまだエラーが出てしまいました ``` 1) Item 商品出品 商品出品できない時 itemが空だと出品できない Failure/Error: expect(item.errors.full_messages).to include('商品の名前を入力してください') expected ["User must exist", "Item can't be blank", "Image can't be blank", "Text can't be blank", "Category c...ping origin は ” -- ” 以外を選択してください", "Arrival day can't be blank", "Arrival day は ” -- ” 以外を選択してください"] to include "商品の名前を入力してください" # ./spec/models/item_spec.rb:17:in `block (4 levels) in <top (required)>' Finished in 0.18859 seconds (files took 2.95 seconds to load) 12 examples, 1 failure Failed examples: rspec ./spec/models/item_spec.rb:14 # Item 商品出品 商品出品できない時 itemが空だと出品できない ``` このようなエラーです、見る限りやはりRspec側ではconfig.i18n.default_locale = :jaがきいていないみたいです疑問ですね。 ですが何はともあれおかげさまで解決いたしました! 本当にありがとうございますした!
no1knows

2020/09/26 23:13

エラーテストの書き方ですが、多くの場合、full_messagesを利用せず、下記のように書くのが一般的かと思います。 expect(message.errors[:item]).to include("を入力してください") 理由としては、できる限り小さい単位でテストをしないと、テスト内容が間違っているとき、どこが間違っているかわからなくなるためです。 EverydayRailsにもテストのベストプラクティスの1つとして下記のように書かれています。 ※「EverydayRails RspecによるRailsテスト入門」とはRailsテストのバイブル的な位置づけかと思います。 もし持っていなければぜひ一度読んでみてください。 example(itで始まる1行)一つにつき、結果を一つだけ期待している。私がfirst_name、last_name、emailのバリデーションをそれぞれ分けてテストしている点に注意してください。こうすれば、exampleが失敗したときに問題が起きたバリデーションを特定できます。原因調査のためにRSpecの出力結果を調べる必要はありません。少なくともそこまで細かく調べずに済むはずです。 なのでテストの有効性と原因調査の精度を上げるために、.errorsでテストしてみるのはいかがでしょうか?
teruan7110

2020/09/27 04:56

情報提供ありがとうございます! なるほどEverydayRailsですか持っていないです知りませんでした読んでみたいですね自分でも調べてみます。 確かに範囲を限定した方が見極めやすいですよね、盲点でした。 今一度教えてくださった方法でerrorsでテスト書き直してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問