Ruby on rails 在应用程序控制器中使用实例变量测试控制器

Ruby on rails 在应用程序控制器中使用实例变量测试控制器,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我试图在控制器中测试我的新视图 class ApplicationController < ActionController::Base before_action :current_cart protect_from_forgery with: :exception private def current_cart @cart = Cart.find(session[:cart_id]) rescue ActiveRecord::Record

我试图在控制器中测试我的新视图

class ApplicationController < ActionController::Base
  before_action :current_cart
  protect_from_forgery with: :exception

  private
    def current_cart
        @cart = Cart.find(session[:cart_id])
    rescue ActiveRecord::RecordNotFound
      @cart = Cart.create
      session[:cart_id] = @cart.id  
      @cart
    end 
end


class controller < ApplicationController
  def new
    if @cart.line_items.empty?
      redirect_to store_url, :notice => "Your cart is empty"
      return
    end

    @order = Order.new

    respond_to do |format|
      format.html
      format.xml { render :xml => @order }
    end  
  end
@cart
未定义


任何线索,谢谢你

你不需要在测试中检查或添加到@cart。您不是在测试购物车的保存,而是在测试您的新购物车是否会渲染。如果你把它拿出来,它就会过去。此外,最好不要拯救这样的异常。您可以改为使用
@cart | |=cart.find_或_create_by_id(会话[:cart_id])
方法

编辑: 我错过了重定向

describe "GET #new" do    
  let(:cart)    { FactoryGirl.create(:cart) }
  let(:product) { FactoryGirl.create(:product) }

  it "renders the :new template" do
    cart.add_product(product.id)
    session[:cart_id] = cart.id
    get :new
    response.should render_template :new
  end
end 

为什么要在那里定义
@cart
?您必须在测试中定义
@cart
。我理解这一点,但如果购物车为空,我在新视图中的控制器逻辑将重定向。那么我该如何测试渲染呢?Thanksnice重构(删除id以使其工作)@cart | |=cart.find_或_create_by(会话[:cart_id])
describe "GET #new" do    
  let(:cart)    { FactoryGirl.create(:cart) }
  let(:product) { FactoryGirl.create(:product) }

  it "renders the :new template" do
    cart.add_product(product.id)
    session[:cart_id] = cart.id
    get :new
    response.should render_template :new
  end
end