【发布时间】:2016-01-27 07:23:55
【问题描述】:
这是我的规范的样子:
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 块顶部的 before_each 调用中被初始化,it 语句所在的块。看起来像这样:
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 -
@TylerFerraro 我刚刚用该信息更新了问题。
-
测试对我来说看起来不错,也许尝试抛出另一个期望语句来验证它是否重定向到
:back或:root_path。测试可能会失败,因为您的用户创建语句失败或没有持久化。 -
@TylerFerraro - 是的……那行得通。我刚刚用结果更新了问题。
标签: ruby-on-rails ruby-on-rails-4 rspec rspec-rails