2017-03-10 15 views
0

いくつかの部分的なレンダリングをチェックするrender_viewsを使用して、いくつかのコントローラのテストを書く....RSpecのコントローラ試験:未定義のメソッド 'orders_path'

describe PromoCodeController do 
    render_views 

    describe "GET 'show" do 
... a bunch of tests 

it "renders 'used' partial when promo code has already been used" do 
    @promo_code = create(:promo_code) 
    @user.stub(:promo_used?).and_return(true) 
    get 'show', :slug => @promo_code.slug 
    expect(response).to render_template(:partial => 'promo_code/_used') 
end 

_used部分

<article> 
    <p><%= @promo.description.html_safe %></p> 
    <p>Sorry, it appears this promo code has already been used. Please try again or contact us directly.</p> 
    <%= link_to "View Order", orders_path(@order), class: "box-button-black", data: { bypass: true } %> 
</article> 

が、休憩中にロードします:どのようにどちらかのの

undefined method `orders_path' for #<#<Class:0x007fd4069d06e8>:0x007fd401e3e518> 

任意のアイデア(a)はRailsのリンクを無視し、それが (b)試験とは無関係だ (c)は、それ(と思う最後の)私がこれまで試した

すべてスタブそのリンクを認識するためのテストで何かを含めますエラーを越えることはありません。

EDIT:

orders_pathは間違っていた、それはorder_pathする必要があります。それを変更した後、私は得る:

したがって、部分は@orderを探しています。私はcontroller.instance_variable_set(:@order, create(:order))でそれを設定しようとしましたが、部分的にはnilとして戻ってきます。

ビューに<% @order = Order.last %>を追加して簡単にテストすると、緑が部分的に緑になります。 var @order_used部分に渡す方法は今問題です。

+0

は、あなたが追加しました:私はCURRENT_USERへの完全な順序を割り当てる方法assign_promo_to_users_orderはトリックをしたスタブ、

ActionView::Template::Error: No route matches {:controller=>"order", :action=>"show", :id=>nil} 

最終的にエラーを回避するためにいくつかのメソッドをスタブにし必要以上に

config/routes.rbにリソースを注文しますか? –

+1

order_pathにする必要がありますか? – margo

答えて

0

まずオフを設定し、私はorder_pathにそれを変更するのに必要な、orders_pathは間違っていました。 Doh。

it "renders 'used' partial when promo code has already been used" do 
    @promo_code = create(:promo_code) 
    @user.stub(:promo_used?).and_return(true) 
    User.any_instance.stub(:assign_promo_to_users_order).and_return(create(:order, :complete)) 
    get 'show', :slug => @promo_code.slug 
    expect(response).to render_template(:partial => 'promo_code/_used') 
end 
0

スペックのタイプを追加してみてください。

アクションコントローラのURLヘルパーがスペックタイプに含まれていると思います。

試してみてください。

describe SomeController, type: :controller do 
0

代わりに手動で設定することができスペックタイプオフに基づいてファイルの場所

# spec_helper.rb 

RSpec.configure do |config| 
    config.infer_spec_type_from_file_location! 
end 

describe 'GET SHOW' do 
    run this in a before block 
    before do 
    controller.instance_variable_set(:@order, create(:order)) 
    end 

    it "renders 'used' partial when promo code has already been used" do 
    promo_code = create(:promo_code) 
    @user.stub(:promo_used?).and_return(true) 
    # check if @order variable is assigned in the controller 
    expect(assigns(:order).to eq order 
    get 'show', slug: promo_code.slug 
    expect(response).to render_template(:partial => 'promo_code/_used') 
    end 
end 
+0

ありがとうDavid ...私はまだ 'ActionView :: Template :: Error: を取得します。{:controller =>" order "、:action =>" show "、:id => nil}'と一致するルートはありません。まだ部分的に@orderを取得していない –

+0

Ryanは、あなたのshowメソッドをコピーして、PromoCodesControllerに貼り付けることができますか? –

関連する問題