私は私のコントローラがあります。第二のフォーマットでrspecの実行でブラウザの動作とコントローラの動作が異なるのはなぜですか?
class Api::BunknotesController < Api::ApiController
# ... omitted code
def show
@bunknote =
current_user.bunknotes.includes(:person).find(params[:id])
respond_to do |format|
format.html {
render layout: false
}
format.pdf {
render pdf: @bunknote.filename,
template: '/bunknotes/show.pdf',
margin: { top: 5, bottom: 5 }
byebug
}
format.json {
render json: @bunknote.api_json(true)
}
end
end
# ... omitted code
end
を、邪悪なPDFをレンダリングするために使用されます。レンダリングされたテンプレートは以下のようになります。私は私のコントローラをヒットしようとすると、私はテンプレートのエラーを持っている
<%= wicked_pdf_stylesheet_link_tag "bunknotes" %>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<div class="page <% if @bunknote.reply %>pagebreak<% end %> bunknote_pdf">
<div class="bn-id">bn<%= @bunknote.id %></div>
<h1>Bunk Note to <%= @bunknote.person ? @bunknote.person.name : @bunknote.writein %> <%= "(#{@bunknote.address})" if @bunknote.address && @bunknote.address.length > 1 %></h1>
<%= render partial: 'details', locals: { :bunknote => @bunknote } %>
</div>
<% if @bunknote.reply %>
<div class="page bunkreply-stationery">
<%=
render partial: '/common/stationery',
locals: {
user_fullname: @bunknote.user.fullname,
org_name: @bunknote.organization.name,
org_id: @bunknote.organization.id,
user_id: @bunknote.user.id,
bunknote_id: "bn#{@bunknote.id}",
barcode_value: "#{has_bunknote = 1}#{@bunknote.id}",
height: "720px",
camper_name: @bunknote.person ? @bunknote.person.name : @bunknote.writein
}
%>
</div>
<% end %>
。エラーの性質は次のとおりです。私のshow.pdf.erbテンプレート(/bunknotes/show.pdf.erb)の中で、私はファイル 'details'を参照しています。私のコントローラはApi::BunknotesController
であるので、最初にこのテンプレートのコピーを持っていたプレフィックスのないBunknotesController
という別のコントローラがあるので、相対的なインクルードは/ app/views/api/bunknotes /の代わりに/ app/views /アプリ/ビュー/ bunknotes。私のブラウザでそれをヒットしようとしていることで
PDFファイルをレンダリングしようとしたとき、私は500を取得し、byebug
命令は、誰もがRecordInvalid
のようにレールに特別な目的のもののうちいずれかの例外を持ったときに期待できるとして、(到達していませんなど)。他の内部構造のため、生成されたpdfはこのシナリオでは壊れています(後で修正するものですが、現在は何かがうまくいかないという良い兆候となります)。
私のテストファイルがどのようなテストの実行時にしかしかなり異なる動作がトリガされた
:
# ... omitted code
describe Api::BunknotesController do
# ... omitted code
it "gets a bunknote (PDF)" do
get :show, {id: bunknote1.id, format: :pdf}
expect(response.status).to be 200
end
# ... omitted code
end
# ... omitted code
RSpecのユーティリティは、この例を実行すると、空白のPDF(非壊れを、しかし完全に空白)がコントローラによって生成され、200応答コードが返されます。
状況が良ければ、200コードでこのテストを成功させました。私の必要性のためにショービューが内部ビューを誤って参照したときに、テストは失敗しているはずです。しかし代わりに、おむつのようなエラーを吸収して空のPDFファイルを生成するように見えました。私はこれがブラウザの呼び出しと同じように動作し、壊れたpdfを生成し、500のコードを返し、失敗することを期待しています。
概要:それは絶対的であるよう
- はい、私は含まビューへのパスを修正します。
- はい、pdf添付ファイルが送信されないように破損したpdf生成を修正します。
- テストは正常に完了してはなりません。このテストは、レスポンスコードが200の場合にのみ成功すると予想されます。これは正しいですが、コントローラはrspec実行時に200を生成し、ブラウザ実行時には500を返しました。
rspec実行時のコントローラの動作がブラウザの実行と異なるのはなぜですか?
私が使用しています:
- ルビー2.3.0p0
- Railsの3.2.22.2
- RSpecの3.4。デフォルトのレールによって1
のようなスペックの上部に
render_views
呼び出しを追加します。 –