Techioz Blog

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