1

コントローラーの 1 つで create メソッドをテストする機能テストを作成しようとしています。私の人生では、なぜこれが失敗しているのか理解できません。1 回失敗し、エラーはゼロです。

1) Failure:
test_should_create_order(OrdersControllerTest) [/Users/user/rails_work/depot/test/functional/orders_controller_test.rb:38]:
"Order.count" didn't change by 1.
<3> expected but was
<2>.

したがって、これは私の機能テストが注文を作成できなかったことを意味していると確信しています。これが私のテストです:

  setup do
    @order = orders(:one)
  end

  test "should create order" do
    assert_difference('Order.count') do
      post :create, order: @order.attributes.slice(Order.accessible_attributes)
    end

    assert_redirected_to store_url
  end

私の注文フィクスチャ:

one:
  name: Dave Thomas
  address: MyText
  email: dave@example.org
  pay_type: Check

そして私の Order#create コントローラー:

def create
    @order = Order.new(params[:order])
    @order.add_line_items_from_cart(current_cart)

    respond_to do |format|
      if @order.save
        Cart.destroy(session[:cart_id])
        session[:cart_id] = nil 
        format.html { redirect_to store_url, notice: 'Thank you for your order' }
        format.json { render json: @order, status: :created, location: @order }
      else
        @cart = current_cart
        format.html { render action: "new" }
        format.json { render json: @order.errors, status: :unprocessable_entity }
      end
    end
  end

ここで、機能テストのセットアップ方法を次のように変更するとします。

@order = Order.create(orders(:one))

それ以外の:

@order = orders(:one)

エラーは消えますが、次のエラーが約 8 個発生します。

NoMethodError: undefined method `stringify_keys' for #<Order:0x007f8c62dbb960>

誰かがこの機能テストを修正するのを手伝ってくれるなら、私はそれを感謝します. あらゆる入力を歓迎します。

4

1 に答える 1

0

結論:order属性を個別に割り当てます。

「大量割り当て」の脆弱性 (Rails の新機能) については詳しくありませんが、ここ (Pragmatic Forums)では、そのために特定のテストで問題を抱えている人がいます。

注文の各属性を個別に綴ってみてください。それ以外の

post :create, order: @order.attributes.slice(Order.accessible_attributes)

使用する

post :create, order: { 
    address: @order.address,
    email: @order.email,
    name: @order.name,
    pay_type: @order.pay_type
}

テスト全体は次のようになります。

test "should create order" do
    assert_difference('Order.count') do
        post :create, order: { address: @order.address, email: @order.email, name: @order.name, pay_type: @order.pay_type }
    end

    assert_redirected_to store_path
end
于 2013-10-24T12:59:32.060 に答える