在这里做了一些研究并使用谷歌后,我仍然对为什么这个简单的规范不起作用感到困惑:
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
答案 0 :(得分:1)
在您的控制器中,您正在销毁可能在规范中的期望内创建的current_cart
,然后销毁,导致更改为0.检查current_cart
的创建/使用方式。
答案 1 :(得分:1)
根据您提供的内容,我想您应该简单地添加:
session[:cart_id] = cart.id
在expect
阻止之前。
为什么呢?看来你并没有真正使用url中传递的id,而是存储在session中的值。但可以肯定的是,您应该提供current_cart
方法。