valid,invalid

関心を持てる事柄について

Controller spec で render_to_string の結果が empty string になる

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

呼ぶ位置が少し気持ち悪い気がする。