アジャイルの本をフォローしていますが、単体テストを動作させるのに問題があります。問題は、1つではなく2つのオブジェクトが作成されていることですrake test:functionals
。理由を特定しましたが、修正を解決できません。
関連するコードは次のとおりです。
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
通常開発環境では、session [:cart_id]にすでにカートがある場合、current_cartは別のカートを作成しません。ただし、テスト環境では、Cart.find(session [:cart_id])を実行するだけで、newcallsが新しいCartアイテムを作成します。.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