2016-04-24 21 views
0

我無法解決此錯誤。我不確定controller_spec的哪個部分寫錯了。請幫忙!rspec控制器測試:「期望#計數已更改-1,但已更改0」

路線

Rails.application.routes.draw do 
    resources :cases, only: [:index, :show, :new, :create, :edit, :update] do 
    resources :links, only: [:create, :destroy] 
    end 
end 

控制器

class LinksController < ApplicationController 

    before_action :prepare_case 

    def destroy 
    @link = @case_file.links.find(params[:id]) 
    @link.destroy 
    redirect_to case_path(@case_file) 
    end 

    private 

    def prepare_case 
    @case_file = CaseFile.find(params[:case_id]) 
    end 
end 

規格/工廠

FactoryGirl.define do 

    factory :link do 

    case_file 
    url 'www.google.com' 

    trait :invalid do 
     case_file nil 
     url '' 
    end 
    end 
end 

規格/控制器

require 'rails_helper' 

RSpec.describe LinksController, type: :controller do 

    let(:user) { build(:user) } 
    before { login_user user } 
    #for user log in 

    let(:case_file) { create(:case_file) } 
    let(:link) { create(:link, case_file: case_file) } 

    describe "DELETE destroy" do 
    it "deletes a link" do 
     expect { delete :destroy, id: link.id , case_id: case_file }. 
     to change(Link, :count).by(-1) 
     expect(response).to redirect_to(case_path(case_file)) 
    end 
    end 
end 

錯誤消息

$ rspec的投機/控制器/ links_controller_spec.rb ... F

失敗:

1)LinksController DELETE刪除銷燬鏈接 失敗/錯誤: expect {delete:destroy,id:link.id,case_id:case_file }。 改變(鏈接,:計數)。通過(-1)

預計#COUNT已經由-1變化,但由0 #./spec/controllers/links_controller_spec.rb:28:in`改變塊(3級)在'

在1.18秒成品(文件採取5.03秒加載) 4實施例中,1次失敗

失敗的例子:

rspec的./spec/controllers/links_controller_spec.rb :27#LinksController DELETE銷燬刪除鏈接

+0

正在使用這些寶石: 寶石 'rspec的護欄', '〜> 3.0' 寶石 '早該-匹配器', '〜> 3.1' 寶石 'factory_girl_rails' –

回答

3

這是一個典型的錯誤(雖然我找不到一個很好的副本)。當你使用let時rspec只執行相關的塊,在你的情況下創建Link對象,當你第一次引用它。

因此,在傳遞到expect的塊內創建和銷燬鏈接:計數不會改變,測試失敗。

您所需要做的只是在測試中早些時候參考link。如果您使用let!而不是let,那麼rspec將在示例運行並且您的測試通過之前創建該對象,而不僅僅是在測試中的某個地方添加一個隨機調用link。這跟做

before(:example) { link } 
1

我發現你的答案非常有用。我發現更多關於let和let的差異信息! here。這裏的關鍵是讓我們懶惰評估。

在這種情況下,我會用let!所以你不需要手動調用該方法。