Rails 4 с Devise, тестирование контроллеров с Rspec

Я новичок в тестировании RSpec и в настоящее время пытаюсь добавить тесты в существующий контроллер для приложения Rails 4. Вот ссылка на приложение Github, если вам нужна дополнительная информация: https://github.com/iacobson/Zero2Dev

resources_controller.rb

    class ResourcesController < ApplicationController
        before_action :authenticate_user!, only:[:new, :create, :destroy]

          def destroy
            @resource = current_user.resources.find(params[:id])
            @resource.destroy
            redirect_to resources_path
          end

        private

        def resource_params
          params.require(:resource).permit(:content, :user_id) 
        end
    end

resources_controller_spec.rb

require 'rails_helper'

RSpec.describe ResourcesController, type: :controller do


  describe "DELETE #destroy" do
    let(:user1) {User.create!(name:"John", email:"[email protected]", password:"password")}
    let(:user2) {User.create!(name:"Mary", email:"[email protected]", password:"password")}
    let(:resource){user1.resources.create!(content: "Neque porro quisquam est qui dolorem ipsum")}


    it "deletes resource when user 1 (that created the resource) is logged-in" do
      sign_in user1
      delete :destroy, id: resource.id
      puts resource.content
      expect(resource.content).to be_nil
    end    
  end        
end

но похоже, что "ресурс" никогда не удаляется:

 Failure/Error: expect(resource.content).to be_nil
       expected: nil
            got: "Neque porro quisquam est qui dolorem ipsum"

Я пробовал много других вариантов из учебника Devise или из других руководств или ответов, которые я нашел в Интернете, но все закончилось ошибкой. Я даже пытался исключить проверку current_user из контроллера, но безуспешно.

Каким будет правильный способ протестировать действие Destroy в контроллере, используя Rails4, Devise и Rspec

Спасибо !


person iacobSon    schedule 07.05.2015    source источник


Ответы (1)


resource, указанный в вашей спецификации, уже загружен и не изменяется при удалении строки из БД. Вы можете сделать пару вещей:

Проверьте, что ресурс ушел из БД

expect(Resource.find_by(id: resource.id)).to be_nil

Проверьте, изменяется ли количество БД

expect { delete :destroy, id: resource.id }.to change(Resource, :count).by(-1)
person Kristján    schedule 07.05.2015
comment
Спасибо! В этом так много смысла, а мой вопрос такой глупый... Я искал ошибку совершенно не в том месте. - person iacobSon; 07.05.2015
comment
Я определенно проделывал это с собой много раз в прошлом :-D Всегда самые простые вещи сбивают вас с толку дольше всего. - person Kristján; 07.05.2015