1

アジャイルの本をフォローしていますが、単体テストを動作させるのに問題があります。問題は、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
4

2 に答える 2

1

テストの動作が異なるものは見当たりませんが、コードが間違っているように見えます。入ってくるリクエストごとにbefore_filter、既存のカートをロードし、存在しない場合は新しいカートを作成します。

beforeフィルターが実行された後、アクションが実行されます。これにより、カートが存在するかどうかを確認せずにカートが作成されるため、2番目のカートが作成されます。

before_filterとcreateアクションの両方がカートを作成しています。beforeフィルターが最初に実行されて作成され、次にcreateアクションが実行されて(カートの存在を確認せずに)別のフィルターが作成されます。

createカートが作成された場合、なぜアクションがあるのか​​わかりません。作成アクションのフィルターをスキップするか、作成アクションを変更して、そのフィルターによって作成されたカートを使用することができます(ただし、作成アクションは単なる更新アクションであり、少し奇妙です)

于 2013-01-19T11:51:37.780 に答える
0

リクエスト仕様または統合テストを使用している場合、これらの種類のテストではリダイレクトが適切に実行されるため、おそらく2つのカートは作成されません。他のテスト、単独でテストし、テストで設定されたときのセッション変数についてはわかりません。しかし、これはテストを見る前に書かれました。

フィクスチャを使用していますか?たぶんカートはすでにロードされています。prygemファイルに追加してみてください。次に、テストで、デバッグステートメントが配置binding.pryされ、テストコンソールに入り、Cart.countカートがいくつ存在するかを確認します。

于 2013-01-19T11:26:35.940 に答える