2016-01-27 107 views
2

這是我的規格看起來像:爲什麼這個刪除測試不會刪除我的對象?

it "should successfullly destroy that user record" do 
    expect { 
     delete :destroy, :id => @user1.id 
    }.to change{User.count}.by(-1) 
    end 

這就要求在這個動作我UsersController

def destroy 
    @user = User.find(params[:id]) 
    if @user.destroy 
     redirect_to root_path, notice: "You have successfully cancelled your account." 
    else 
     redirect_to :back 
    end 
    end 

但是當我運行規範,我得到這個:

RSpec::Expectations::ExpectationNotMetError: expected result to have changed by -1, but was changed by 0 

如何我解決這個問題嗎?

編輯1

@user1在該context塊的it聲明住在頂端的before_each呼叫正在初始化,看起來像這樣:

context "when the inviter is being deleted and invited has not accepted invitation" do 
    before :each do 
    @user1 = create(:user, gender: 0) 
    @user2 = create(:user) 
    @member = create(:member, email: @user2.email, first_name: @user2.first_name, last_name: @user2.last_name, bio: @user2.bio, gender: @user2.gender) 
    @membership = create(:membership, member: @member, family_tree: @user1.family_tree, inviter: @user1, relation: "sister") 
    @connection = create(:connection, inviter_membership: @membership) 
    login_user 
    end 

編輯2

當我換出這個測試,它的工作原理:

it "should successfullly destroy that user record" do 
    delete :destroy, id: @user1 
    expect(response).to redirect_to(root_path) 
    # expect { 
    # delete :destroy, id: @user1 
    # }.to change(User,:count).by(-1) 
    end 

該測試成功通過。

Finished in 1.2 seconds (files took 6.08 seconds to load) 
19 examples, 0 failures, 15 pending 

編輯3

對於它的價值,在我UsersController我在上面呼叫load_and_authorize_resource。當我刪除它時,測試似乎通過。所以問題是,我如何才能使用CanCanCan?

這是我的ability.rb樣子:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user (not logged in) 
    if user.has_role? :admin 
     can :manage, :all 
    end 

    can :manage, FamilyTree, user_id: user.id 
    can :manage, Comment, user_id: user.id 
    can :manage, Node, user_id: user.id 
    can :manage, Event, user_id: user.id 
    can :manage, User, id: user.id 

    can :read, Comment, user_id: user.id 
    can :read, Event, user_id: user.id 
    end 
end 

編輯4

當我添加一個raisedestroy行動......沒有任何反應。所以它似乎確實沒有執行我的destroy動作。

編輯5

這是我login_user方法是什麼樣子:

module SpecAuthentication 
    def login_user 
    @request.env["devise.mapping"] = Devise.mappings[:user] 
    @user = FactoryGirl.create :user 
    sign_in @user 
    end 
end 
+0

你可以顯示你正在初始化'@ user1'的位置嗎? – Genzume

+0

@TylerFerraro我剛剛用這個信息更新了問題。 – marcamillion

+2

測試對我來說看起來沒問題,也許嘗試拋出另一個期望語句來驗證它是否重定向到':back'或到':root_path'。測試可能失敗,因爲您的用戶創建語句失敗或不持續。 – Genzume

回答

2

隨着CanCanCan寶石,你必須讓控制器動作。您需要將其添加到您的ability.rb文件中。

can :destroy, User

這將允許任何人與該角色摧毀一個用戶對象。您可以添加更多的細節以適合您的用例。

編輯:剛纔看到了關於CanCanCan gem的:manage文檔。

您目前的能力檔案允許使用者管理自己。您的login_user方法正在創建一個用戶,而您的測試試圖摧毀一個單獨的用戶。您可以更新您的CanCan能力,讓所有用戶被銷燬或嘗試銷燬current_user.id,假設您有current_user方法。我強烈建議將您的login_user方法更改爲接受用戶對象,以便您知道哪個用戶已登錄並可以訪問該對象。

編輯:

如上所述,使用一種方法來sign_in特定用戶,這樣就可以訪問它作爲一個對象。將login_user呼叫替換爲sign_in @user1或接受用戶對象的類似方法。

+0

不應'可以:管理,用戶,id:user.id'封面':銷燬'? – marcamillion

+0

這實際上提出了另一個問題,當我運行我的規格時,我怎樣才能找出'current_user'的'id'? – marcamillion

+0

你是對的我對'can:manage'不熟悉。你可以顯示你的'login_user'方法嗎? – Genzume

2

destroy行動不是由規範命中,檢查是否存在某種一個before_action阻止它這樣做。

我會做這樣的事情:

def destroy 
    raise # The action was hit 
    @user = User.find(params[:id]) 
    if @user.destroy 
     redirect_to root_path, notice: "You have successfully cancelled your account." 
    else 
     redirect_to :back 
    end 
    end 
+0

我剛更新了這個問題。當我修改了測試以檢查響應中的'redirect_to'路徑時,它似乎到了正確的位置 - 這是'root_path',只有在控制器中成功調用了@ user.destroy'時纔會發生。所以它似乎實際上正在觸及那個'摧毀'行動,還是我錯過了什麼? – marcamillion

+0

不知道它是否重要,但我的控制器上唯一的'before_action'是CanCanCan所需的'load_and_authorize_resource'。這可能是授權問題嗎?不確定情況如何,''redirect_to root_path'從我之前的評論中可以看出。 – marcamillion

+0

如果您將'raise'語句放在'destroy'動作的頂部,您會得到什麼? – DevMarwen

相關問題