2016-06-27 12 views
0

私は私のコントローラがあります。第二のフォーマットで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のコードを返し、失敗することを期待しています。

概要:それは絶対的であるよう

  1. はい、私は含まビューへのパスを修正します。
  2. はい、pdf添付ファイルが送信されないように破損したpdf生成を修正します。
  3. テストは正常に完了してはなりません。このテストは、レスポンスコードが200の場合にのみ成功すると予想されます。これは正しいですが、コントローラはrspec実行時に200を生成し、ブラウザ実行時には500を返しました。

rspec実行時のコントローラの動作がブラウザの実行と異なるのはなぜですか?

私が使用しています:

  • ルビー2.3.0p0
  • Railsの3.2.22.2
  • RSpecの3.4。デフォルトのレールによって1

答えて

2

/RSpecのは、テストでコントローラのビューをレンダリングしません。 );レンダリングするビューを取得するには、あなたがより多くのupvotesと、おそらくbedmate今夜に値するので

describe Api::BunknotesController do 
    render_views 
    # 
    # 
    it "does..." do 
    end 
end 
+0

のようなスペックの上部にrender_views呼び出しを追加します。 –

関連する問題