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

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

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

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

RSpec

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

Q&A

1回答

217閲覧

Rspec メッセージ 使い方

takeke

総合スコア60

Ruby on Rails 5

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

RSpec

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

0グッド

0クリップ

投稿2018/11/22 02:41

Rspecでofferというデータの一覧画面でofferが一つもない場合に、”offerがありません”と表示させて、その表示ができてるかのケースを作りたいのですが、どのように記述したらよいでしょうか?
offerのカラムはid,name,detail,status,delere_fragです。

コントローラーに上記メッセージ記述する必要ありますよね?

その記述とspecの記述がわからないのでアドバイスなどいただきたいですm(__)m

specの記述で自分なりに考えたのですが、expect内がわかりませんでした。

rails

1let!(:offer) { create(:offer) } 2it "一覧にデータない表示" do 3 get '/user/offers' 4 offer = nil 5 expect(). to eq error_message 6end 7

factorybotも使っていて、そちらに仮のデータは入れてあります。

以上です。勉強したてなのでわからないことが多いのですが、他に必要なデータなどありそうでしたら言ってください。よろしくお願いいたしますm(__)m

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

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

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

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

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

guest

回答1

0

まずなんのテストなのかがわからないですが、内容的にControllerSpecですかね...?
もしそうであればControllerSpecで行うべき検証ではないので必要ないです。

FeatureSpecであれば書き方が違うって話になりますが、expectの部分のみについては

ruby

1expect(page).to have_content 'offerがありません'

でページ内に'offerがありません'の表示があるか否かの検証ができます。

ついでにoffer = nilとするくらいなら
let!(:offer) { create(:offer) }を用意する必要がないので
この2つは不要だと思います。


追記

RequestSpecならば

ruby

1expect(response.body).to include 'offerがありません'

で検証できます。

ただ、今回のような条件によって表示が変わる部分の検証をRequestSpecで行うべきではないです。
RequestSpecでは主にリクエストが成功することと、想定するレスポンスがあることのみを検証します。
簡単に言えばちゃんとアクセスできるかということと表示されるページが間違えてないかということです。
加えてデータの保存、編集、削除が行われたかどうかくらいですかね。

サンプル

ruby

1describe OffersController, type: :request do 2 describe '#index' do 3 it 'リクエストが成功し、一覧画面が表示されていること' do 4 get offers_url 5 aggregate_failures do 6 expect(response.status).to eq 200 7 expect(response.body).to include 'オファー一覧' 8 end 9 end 10 end 11end

みたいな感じですかね。

モデルなどコントローラとは関係ない部分の条件によって変わる
表示内容についてはFeatureSpecで検証を行うのがいいと思います。

投稿2018/11/22 05:07

編集2018/11/22 06:16
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

takeke

2018/11/22 05:44

回答ありがとうございます!spec自体よくわからずやっているのでわかりませんが、spec/requestsでやっています。 let!(:offer) { create(:offer) }はなくして、 it "一覧にデータない表示" do get '/user/offers' offer = nil expect(page).to have_content 'offerがありません' end でやったところ、こちらの」エラーがでてしまいました。 NameError: undefined local variable or method `page' for #<RSpec::ExampleGroups::OffersIndex::GETUserOffers::Nested::Nested:0x00007f904a5beac8> pageが使えないということでしょうか?
退会済みユーザー

退会済みユーザー

2018/11/22 05:55

pageはFeatureSpecで用意されるものなのでRequestSpecでは使えません。 回答編集しておきます。
takeke

2018/11/22 08:34

ありがとうございます! responce.bodyは使えたのですが、何もエラーメッセージが入っていないようです。 結果です↓ expected "{\"data\":[],\"errors\":[]}" to include "offerがありません" こちらofferがない場合に "offerがありません"と出力するためにはどうしたらよいでしょうか?
退会済みユーザー

退会済みユーザー

2018/11/22 08:48

ですからRequestSpecでやるべき検証ではないのでやるならFeatureSpecなどで行うべきです。 もともとRequestSpecはそういったものを検証するように作られたテストではないので。
takeke

2018/11/22 09:27

度々すみません。では、今やろうとしている検証は、spec/feature/offer.rbとか作ってそこでやったほうがいいということなんですね! 質問箇所はrequest/offer/offer_index.rbなのですが、ここでは、この画面に遷移した時のGETやPOSTをテストということなんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問