Почему этот простой метод уничтожения не работает? - PullRequest
1 голос
/ 26 октября 2011

Проведя некоторое исследование здесь и используя Google, я все еще не понимаю, почему эта простая спецификация не работает:

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

Ответы [ 2 ]

1 голос
/ 26 октября 2011

В зависимости от того, что вы предоставляете, я думаю, вы должны просто добавить:

session[:cart_id] = cart.id

перед вашим expect блоком.

Почему? Кажется, вы на самом деле не используете идентификатор, переданный в URL, а значение, сохраненное в сеансе. Но чтобы быть уверенным, вы должны предоставить свой метод current_cart.

1 голос
/ 26 октября 2011

В вашем контроллере вы уничтожаете current_cart, который может быть создан внутри ожидаемого в спецификации, а затем уничтожен, что приводит к изменению 0. Проверьте, как current_cart создается / используется.

...