gpt4 book ai didi

ruby-on-rails - 无方法错误 : undefined method `email' for nil:NilClass (Rspec/factory girl/cancan/devise)

转载 作者:行者123 更新时间:2023-12-04 02:51:44 24 4
gpt4 key购买 nike

我正在学习 Hartl 的 Rails 教程,但我使用了 devise/cancan/rolify,所以有些东西不一样。

在我的 users_pages_spec.rb 测试中,尽管我尝试了所有方法,但我仍然收到此错误:

1) User pages index delete links as an admin user 
Failure/Error: sign_in @superadmin
NoMethodError:
undefined method `email' for nil:NilClass
# ./spec/support/utilities.rb:14:in `sign_in'
# ./spec/requests/user_pages_spec.rb:91:in `block (5 levels) in <top (required)>'

2) User pages index delete links as an admin user
Failure/Error: sign_in @superadmin
NoMethodError:
undefined method `email' for nil:NilClass
# ./spec/support/utilities.rb:14:in `sign_in'
# ./spec/requests/user_pages_spec.rb:91:in `block (5 levels) in <top (required)>'

3) User pages index delete links as an admin user should be able to delete another user
Failure/Error: sign_in @superadmin
NoMethodError:
undefined method `email' for nil:NilClass
# ./spec/support/utilities.rb:14:in `sign_in'
# ./spec/requests/user_pages_spec.rb:91:in `block (5 levels) in <top (required)>'

4) User pages index delete links as an admin user
Failure/Error: sign_in @superadmin
NoMethodError:
undefined method `email' for nil:NilClass
# ./spec/support/utilities.rb:14:in `sign_in'
# ./spec/requests/user_pages_spec.rb:91:in `block (5 levels) in <top (required)>'

我不明白为什么,nil::nilClass 意味着工厂女孩实际上没有设法创建这个 super 管理员用户吗?

这是我的 user_pages_spec.rb 文件的示例:

require 'spec_helper'
require 'cancan/matchers'

# Test if targeted words appears in displayed content

describe "User pages" do

subject { page }
let(:user) { FactoryGirl.create(:user) }
let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") }
let(:non_admin) { FactoryGirl.create(:user) }
let(:submit) { "Sign in" }

describe "index" do
describe "delete links" do

it { should_not have_link('delete') }

describe "as an admin user" do
let(:superadmin) { FactoryGirl.create(:superadmin) }
before do
sign_in @superadmin
visit users_path
end
it { should have_title('List of users') }

it { should have_link('delete', href: user_path(User.first)) }
it "should be able to delete another user" do
expect { click_link('delete') }.to change(User, :count).by(-1)
end
it { should_not have_link('delete', href: user_path(superadmin)) }
end
end
end
end

我的 spec/utilities.rb 定义登录方法

include ApplicationHelper

def sign_in(user)
visit new_user_session_path
fill_in "Email", with: user.email
fill_in "Password", with: user.password
click_button "Login"
#populate cookie when not using capybara
cookies[:authentication_token] = user.authentication_token
end

和我的 spec/factories/user.rb

FactoryGirl.define do
factory :user do
sequence(:name) { |n| "Person #{n}" }
sequence(:email) { |n| "person_#{n}@example.com"}
password "beta"
password_confirmation "beta"
# required if the Devise Confirmable module is used
confirmed_at Time.now
confirmation_token nil

factory :superadmin do
after(:create) {|user| user.add_role(:superadmin)}
end
end

end

我确实在 cancan/rolify 中定义了一个 super 管理员角色。

如果有人有线索,我会接受的!如果此处还没有,我可以使用所需的其他文件更新问题。

最佳答案

您的 let 调用正在设置 superadmin,但您正在引用 @superadmin,这将是 nil,因为它还没有被设置。顺便说一句,这是通常避免在测试中使用实例变量的一个很好的理由,因为如果未初始化,它们在引用时默认默认为 nil

关于ruby-on-rails - 无方法错误 : undefined method `email' for nil:NilClass (Rspec/factory girl/cancan/devise),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17533573/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com