這是我的規格看起來像:爲什麼這個刪除測試不會刪除我的對象?
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
當我添加一個raise
我destroy
行動......沒有任何反應。所以它似乎確實沒有執行我的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
你可以顯示你正在初始化'@ user1'的位置嗎? – Genzume
@TylerFerraro我剛剛用這個信息更新了問題。 – marcamillion
測試對我來說看起來沒問題,也許嘗試拋出另一個期望語句來驗證它是否重定向到':back'或到':root_path'。測試可能失敗,因爲您的用戶創建語句失敗或不持續。 – Genzume