View でちょっと頑張る必要があり Controller から render_to_string
で文字列を得てから JSON に突っ込むようなエンドポイントがあるとする。
# controller/books_controller.rb class BooksController # GET /book/:id def show @book = Books.find! params[:id] render json: { book: render_to_string(:show), meta: @book.meta, } end end
# view/books/show.erb <%= extremely_decorate @book %> <%= other_info %>
(※ 単純化すると View でやることではないのだが、現実はもっと込み入っている…)
このエンドポイントの controller spec として以下のようなテストを書くと render_to_string の結果が empty string になる。
# spec/controller/books_controller_spec.rb describe '#show' do it 'returns expected JSON' do subject response_json = JSON.parse(response.body) expect(response_json['book']).to eq "decorated book expression" # got: "" で落ちる end end
controller spec では通常 view を render しないので render_views を呼ぶ必要がある。
# spec/controller/books_controller_spec.rb describe '#show' do render_views it 'returns expected JSON' do subject response_json = JSON.parse(response.body) expect(response_json['book']).to eq "decorated book expression" # It passes! end end
呼ぶ位置が少し気持ち悪い気がする。