Rails 4 使用 Devise,使用 Rspec 测试控制器

Rails 4 with Devise, testing Controllers with Rspec

我是 RSpec 测试的新手,目前正在尝试为 Rails 4 应用程序向现有控制器添加测试。 这是 Github 应用程序 link,如果您需要更多详细信息: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:"john@mail.com", password:"password")}
    let(:user2) {User.create!(name:"Mary", email:"mary@mail.com", 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

但看起来 "resource" 永远不会被删除:

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

我尝试了很多来自 Devise 教程或其他教程或我在互联网上找到的答案的其他选项,但都以错误告终。 我什至试图从控制器中消除 current_user 验证,但没有机会。

使用 Rails4、Devise 和 Rspec

在控制器中测试 Destroy 操作的正确方法是什么

谢谢!

您在规范中的 resource 已经加载,并且在从数据库中删除该行时不会更改。你可以做几件事:

测试资源是否从数据库中消失

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

测试数据库计数变化

expect { delete :destroy, id: resource.id }.to change(Resource, :count).by(-1)