Rspec错误,“nil的未定义方法’downcase’:NilClass”
我在运行Rspec测试时不断收到此错误,但无法弄清楚原因。 我对Rails(以及一般的编程)都很陌生,所以任何方向或帮助都会非常感激!
编辑:这是一个回购链接,如果有人想筛选和/或复制错误。 https://github.com/FluxAnimus/sample_app/tree/sign-up
Failures: 1) User pages profile page Failure/Error: before { visit user_path(user) } ActionView::Template::Error: undefined method `downcase' for nil:NilClass # ./app/helpers/users_helper.rb:5:in `gravatar_for' # ./app/views/users/show.html.erb:3:in `_app_views_users_show_html_erb__1766857043046396980_38603940' # ./spec/requests/user_pages_spec.rb:9:in `block (3 levels) in ' 2) User pages profile page Failure/Error: before { visit user_path(user) } ActionView::Template::Error: undefined method `downcase' for nil:NilClass # ./app/helpers/users_helper.rb:5:in `gravatar_for' # ./app/views/users/show.html.erb:3:in `_app_views_users_show_html_erb__1766857043046396980_38603940' # ./spec/requests/user_pages_spec.rb:9:in `block (3 levels) in ' Finished in 0.46129 seconds 39 examples, 2 failures Failed examples: rspec ./spec/requests/user_pages_spec.rb:12 # User pages profile page rspec ./spec/requests/user_pages_spec.rb:11 # User pages profile page
我在Ruby on Rails教程的第7.13章中。 测试清除得很好,直到我添加了Gravatar代码和FactoryGirls Gem。
/app/helpers/users_helper.rb文件
module UsersHelper # Returns the Gravatar (http://gravatar.com/) for the given user. def gravatar_for(user) gravatar_id = Digest::MD5::hexdigest(user.email.downcase) gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}" image_tag(gravatar_url, alt: user.name, class: "gravatar") end end
规格/请求/ user_pages_spec.rb
require 'spec_helper' describe "User pages" do subject { page } describe "profile page" do let(:user) { FactoryGirl.create(:user) } before { visit user_path(user) } it { should have_content(user.name) } it { should have_title(user.name) } end . . . end
最后一个参考:app / views / users / show.html.erb
这是工厂文件:
FactoryGirl.define do factory :user do name "Michael Hartl" email "michael@example.com" password "foobar" password_confirmation "foobar" end end
应用程序/控制器/ users_controller.rb
class UsersController < ApplicationController def show @user = User.find(params[:id]) end def new end end
假设您在本教程中使用了gravatar_for
的定义,则仅在user.email.downcase
的上下文中引用user.email.downcase
,这意味着已定义user
,但user
的email
方法/属性返回nil
。 您还可以使用堆栈跟踪中提供的文件名,方法和行号来识别有问题的代码。
更新:在您的User
模型中,您有一个before_save
调用,其中包括以下内容:
self.email = email.downcase!
自从downcase!
返回nil
,这具有将email
设置为nil
的效果。 根据教程,您可以使用以下任一方法:
self.email.downcase!
要么:
self.email = email.downcase
你有一个你认为是字符串的变量,但它实际上是nil
。
你不能在nil
上调用downcase
,所以你得到这个错误。
欢迎来到Ruby,你会看到很多。 🙂
编辑
我看到你在问题中添加了一些代码。
正如错误消息所示,它是user_helper.rb第5行:
gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
它的user.email
是nil
。 我猜你的FactoryGirl工厂没有为用户分配电子邮件地址。
- Hartl对config.serve_static_files的sample_app警告,并且已经定义了测试
- Rails教程sample_app在Heroku中失败,带有log:ActionController :: RoutingError(没有路由匹配“/ about”):
- Rails教程(M.Hartl)第3版,第8章,如何通过关闭流氓`rails console`来解锁数据库?
- 失败:在轨道上的ruby上预期0> = 1
- 如何在部署到heroku时解决rails中的更新捆绑器警告?
- 为什么我的RSpec测试失败,但我的应用程序正在运行?
- Rails教程:RSpec测试解耦
- RailsTutorial.org – 用户中的ExecJS :: RuntimeError #index
- Hartl的导轨教程在当地完成了作品。 Heroku坚持“我们很抱歉,但出了点问题。”