我正在關注敏捷書籍,並且在單元測試中表現不佳。問題是在rake test:functionals
期間正在創建兩個對象,而不是一個。我找出了原因,但我無法解決問題。Rails - 停止測試環境與Obj.find()創建新的對象?
下面是相關代碼:
class CartsController < ApplicationController
def create
@cart = Cart.new(params[:cart])
session[:cart_id] = @cart.id
respond_to do |format|
if @cart.save
format.html { redirect_to @cart }
format.json { render json: @cart, status: :created, location: @cart }
else
format.html { render action: "new" }
format.json { render json: @cart.errors, status: :unprocessable_entity }
end
end
endnormal
,當它重定向到@cart,它會調用application_controller,其中包含此代碼:
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :the_cart
private
def the_cart
@cart = current_cart
end
def current_cart
Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
cart = Cart.create
session[:cart_id] = cart.id
cart
end
正常 在開發環境中,current_cart會當會話[:cart_id]已經有購物車時,不會創建另一個購物車。但在測試環境中,只需運行Cart.find(會話[:cart_id])就會創建一個新的呼叫新的購物車項目。我該如何解決這個問題,以便.find不會每次爲測試環境創建一個新對象?
編輯:這裏是如果你使用的是請求規範或集成測試,失敗
test "should create cart" do
Rails::logger.debug "CREATING CART"
Rails::logger.debug Cart.all.to_a
assert_difference('Cart.count') do
post :create, cart: { }
Rails::logger.debug Cart.all.to_a
end
assert_redirected_to cart_path(assigns(:cart))
end
你爲什麼不希望它這樣做? – sevenseacat
它未通過測試。我可以對2個更新項目進行測試檢查,但似乎有點不清楚,每次調用Cart.new時,假定的函數總是創建兩個新的cart對象。我如何才能在測試環境中創建單個對象? – Xiv
您可能必須發佈您的測試,因爲不應創建兩個購物車。 – sevenseacat