Rails RSpec で it_behaves_like にブロックを渡すことはできますか?
概要
共有された例があるとします。
shared_examples 'success' do
let(:params) { key: "value" }
it "returns data" do
post "/api/users", params: params
expect(response.status).to eq (201)
end
end
この共有サンプルを it_behaves_like で使用する場合、ブロックを渡して、予想されるリストを拡張できますか?
たとえば、私は次のように書きます。
it_behaves_like "success" do
expect(response['id]).to eq(1)
end
rspec が次のようにコンパイルすることを期待しています。
it "returns data" do
post "/api/users", params: params
expect(response.status).to eq (201)
expect(response['id]).to eq(1)
end
上記のコードは明らかに私が望んでいたように機能していませんが、RSpec が上記の期待した結果のように理解できるようにコードを記述する方法を知りたいです。出来ますか?
解決策
これを、API リクエストを実行する共有コンテキストとステータス コードをチェックする共有サンプルに分けることができます。例:
shared_context 'request' do
before do
post '/api/users', params: params
end
end
shared_examples 'success' do
it 'returns with 201 status code' do
expect(response.status).to eq (201)
end
end
これらは次のように組み合わせることができます。
describe 'a successful request' do
include_context 'request' do
let(:params) { { key: 'value' } }
end
it_behaves_like 'success'
it 'returns data' do
expect(response['id']).to eq(1)
end
end