まさ@ブログ書き込み中

自由に生きるための英語、プログラミング、考えごとについて色々書いています。

RSpecのhave_http_statusとrespond_withの挙動について

こんばんは、まさです。

今日はコードを書いていて気になったことについてまとめることにしました。

 

respond_withとは

それはrespond_with(:success)というRSpecのコードでした。

 

なんとなく「あるリクエストのレスポンスのステータスコードをチェックするんだろうな」とは思いつつも、実際のところどういう挙動をするのかわかりませんでした。

 

調べてみると、shoulda-matchersのマッチャーであることがわかりました。思った通りステータスコードをチェックするためのもの。

 

Module: Shoulda::Matchers::ActionController — Documentation by YARD 0.8.7.3Module: Shoulda::Matchers::ActionController — Documentation by YARD 0.8.7.3

 

しかし、僕が見たコードではshouldはなくis_expected.to respond_with(:success)のように書かれていました。多分どちらでも書けるんだろうな。

 

 

have_http_statusとは

同じようにステータスコードをチェックするマッチャーの中でRSpecで推奨されているマッチャーがhave_http_statusです。


`have_http_status` matcher - Matchers - RSpec Rails - RSpec - Relish

 

expect(response).to have_http_status(:ok)という風に書くことが出来ます。

 

 

両者の違いはなに?

ここからが本題ですが、似たようなこの二つのマッチャー、どうやら挙動が少し違うみたいなのです。

 

before { get :index } など前もってリクエストを投げるテストではなくsubject { get :show, id: invalid_id } というような形でリクエストをsubjectに定義し、404が返ってくることをテストする場合、

 

  1. is_expected.to respond_with(:missing) はうまくいかない
  2. expect(response.status).to be 404 はうまくいく
  3. is_expected.to have_http_status(:not_found) はうまくいく

 

という違いがあるのです。2は「そうだろうな」という感じなのですが、1と3の違いがイマイチわからない・・・。何が違うんだ!

 

ググって見たら他の人たちも質問している・・・。

ruby on rails - RSpec tests failing with undefined method `respond_with' - Stack Overflow

 

 

解決し次第更新します

何が起きているんだろう?

 

色々調べて、疑問が解決されしだいブログを更新します。

 

今日はここまで、ではまた。