您好我正在实施一种方法来删除我的Web应用程序中的用户帐户。我的控制器:
class UsersController < ApplicationController
before_filter :set_current_user
def user_params
params.require(:user).permit(:user_id, :first_name, :last_name, :email, :password, :password_confirmation)
end
def delete_account
@user = User.find_by_id(params[:id])
if @user.present?
@user.destroy
flash[:notice] = "User Account Deleted."
end
redirect_to root_path
end
def destroy
User.delete(:user_id)
redirect_to root_path
end
end
我的rspec:
require 'spec_helper'
require 'rails_helper'
require'factory_girl'
describe UsersController do
describe "delete account" do
before :each do
@fake_results = FactoryGirl.create(:user)
end
it "should call the model method that find the user" do
expect(User).to receive(:find).with(params[:id]).and_return (@fake_results)
end
it "should destroy the user account from the database" do
expect{delete :destroy, id: @fake_results}.to change(User, :count).by(-1)
end
it "should redirect_to the home page" do
expect(response).to render_template(:home)
end
end
end
第一个错误是
Failure/Error: expect(User).to receive(:find).with(params[:id]).and_return (@fake_results)
NameError:undefined local variable or method `params' for #<RSpec::ExampleGroups::UsersController::DeleteAccount:0x00000007032e18>
我知道这个错误意味着什么,但我不知道如何纠正它。如何将用户ID从控制器传递给rspec?
第二个错误是:
Failure/Error: expect(response).to render_template(:home)
expecting <"home"> but rendering with <[]>
我认为我的控制器方法有问题。它应该重定向到主页,但它没有。
答案 0 :(得分:0)
params
在您的测试中不可用,它在您的控制器中可用。
看起来你在测试中创建了一个测试用户:
@fake_results = FactoryGirl.create(:user)
然后,您可以使用此测试用户的id
(@fake_results.id
),而不是尝试使用params[:id]
:
expect(User).to receive(:find).with(@fake_results.id).and_return (@fake_results)
尽管如此,您可能希望将名称从@fake_results
更改为更有意义的内容,例如test_user
左右。
然而,由于第一个问题,这应该解决你的第二个问题。由于它首先未能删除用户,因此未将其重定向到根路径,因此home
模板未呈现。