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