でテストされた Rails 4.2.0 アプリケーションでrspec-rails
は、JSON Web API に REST に似たリソースを必須属性で提供しますmand_attr
。
BAD REQUEST
この属性が POST リクエストにない場合、この API が HTTP コード 400 ( ) で応答することをテストしたいと思います。ActionController::ParameterMissing
(以下の 2 番目の例を参照してください。) 私のコントローラーは、以下の最初の RSpec の例に示されているように、 をスローすることによって、この HTTP コードを引き起こそうとします。
他のRSpec の例では、発生した例外を例によってレスキューする (予想される場合) か、テスト ランナーをヒットして、開発者に表示されるようにする (エラーが予期しない場合) ことを望んでいます。削除する
# Raise exceptions instead of rendering exception templates.
config.action_dispatch.show_exceptions = false
からconfig/environments/test.rb
。
私の計画は、 request specに次のようなものを含めることでした:
describe 'POST' do
let(:perform_request) { post '/my/api/my_ressource', request_body, request_header }
let(:request_header) { { 'CONTENT_TYPE' => 'application/json' } }
context 'without mandatory attribute' do
let(:request_body) do
{}.to_json
end
it 'raises a ParameterMissing error' do
expect { perform_request }.to raise_error ActionController::ParameterMissing,
'param is missing or the value is empty: mand_attr'
end
context 'in production' do
###############################################################
# How do I make this work without breaking the example above? #
###############################################################
it 'reports BAD REQUEST (HTTP status 400)' do
perform_request
expect(response).to be_a_bad_request
# Above matcher provided by api-matchers. Expectation equivalent to
# expect(response.status).to eq 400
end
end
end
# Below are the examples for the happy path.
# They're not relevant to this question, but I thought
# I'd let you see them for context and illustration.
context 'with mandatory attribute' do
let(:request_body) do
{ mand_attr: 'something' }.to_json
end
it 'creates a ressource entry' do
expect { perform_request }.to change(MyRessource, :count).by 1
end
it 'reports that a ressource entry was created (HTTP status 201)' do
perform_request
expect(response).to create_resource
# Above matcher provided by api-matchers. Expectation equivalent to
# expect(response.status).to eq 201
end
end
end
回答として投稿する2つの機能するソリューションと1つの部分的に機能するソリューションを見つけました。しかし、私はそれらのどれにも特に満足しているわけではないので、より良い (またはまったく異なる) 何かを思いつくことができれば、あなたのアプローチを見てみたいです! また、リクエスト スペックがこれをテストするのに不適切なタイプのスペックである場合は、そのことを知りたいです。
私はその質問を予見します
Rails アプリケーションだけでなく、Rails フレームワークをテストするのはなぜですか? Rails フレームワークには独自のテストがあります。
ここでフレームワーク自体をテストしているのではなく、フレームワークを正しく使用しているかどうかをテストしていると思います。ActionController::Base
私のコントローラーはから継承していませんが、デフォルトで使用するかどうか、または最初にコントローラーに何らかの方法でそうするように指示する必要があるかどうかはActionController::API
わかりませんでした。ActionController::API
ActionDispatch::ExceptionWrapper