1

在这里做了一些研究并使用谷歌之后,我仍然对为什么这个简单的规范不起作用感到困惑:

describe CartsController do
  #stuff omitted...
  describe "carts#destroy" do
    it "destroys the requested cart" do
      cart = FactoryGirl.create(:cart)
      puts "Cart count = #{Cart.count}"
      expect {
        delete :destroy, :id => cart.id
      }.to change(Cart, :count).by(-1)
    end
  end
#stuff omitted...
end

这是 CartsController 的操作:

class CartsController < ApplicationController

  def destroy
    @cart = current_cart
    @cart.destroy
    session[:cart_id] = nil

    respond_to do |format|
      format.html { redirect_to(store_url, :notice => 'Your cart is currently empty') }
      format.json { head :ok }
    end
  end

end

最后但并非最不重要的是,我得到的错误:

Cart count = 1
F

Failures:

  1) CartsController carts#destroy destroys the requested cart
     Failure/Error: expect {
       count should have been changed by -1, but was changed by 0
     # ./spec/controllers/carts_controller_spec.rb:146:in `block (3 levels) in <top (required)>'

Finished in 6.68 seconds
1 example, 1 failure

但是,我是 rspec 测试的新手,据我了解,我的销毁规范非常简单,它应该按预期执行。我不知道我做错了什么..

请帮助我,一如既往的感谢,

编辑..这是 current_cart 方法:

def current_cart
  Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
  cart = Cart.create
  session[:cart_id] = cart.id
  cart
end
4

2 回答 2

1

在您的控制器中,您正在销毁current_cart可能在规范中的期望内创建的,然后销毁,导致更改为 0。检查如何current_cart创建/使用。

于 2011-10-25T20:09:37.063 回答
1

根据您提供的内容,我想您应该简单地添加:

session[:cart_id] = cart.id

在你的expect块之前。

为什么?看来您并没有真正使用 url 中传递的 id 而是存储在 session.xml 中的值。但可以肯定的是,您应该提供您的current_cart方法。

于 2011-10-25T20:11:36.397 回答