1

所以我正在研究 Ruby on Rails 3 教程。我目前在第 7.1.3 节使用工厂测试用户显示页面。

该代码正在运行并提取正确的 gravatar 图像,但是在运行测试时我不断收到错误消息。

这是错误:

Failure/Error: before { visit user_path(user) }
     ActionView::Template::Error:
       undefined method `downcase' for nil:NilClass

以下是 show.html.erb 文件中的代码:

<% provide(:title, @user.name) %>
<h1>
  <%= gravatar_for @user %>
  <%= @user.name %> 
</h1>
<%= @user.name %>, <%= @user.email %>

这是 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

这是 factory.rb 文件中的代码:

FactoryGirl.define do
  factory :user do
    name "Curtis Test"
    email "test@gmail.com"
    password "foobar"
    password_confirmation "foobar"
  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_selector('h1', text: user.name) }
    it { should have_selector('title', text: user.name) }
  end

  describe "signup page" do
    before { visit signup_path }
    it { should have_selector('title', text: full_title('Sign Up')) }
  end
end
4

2 回答 2

1

我发现了我的问题。它与 FactoryGirl 无关。问题出在我的用户模型(user.rb)中,导致问题的行是

  before_save { |user| user.email = user.email.downcase! }

小写后的爆炸导致电子邮件地址在小写返回后被保存为 nil!是零。一旦我删除它并使线条看起来如下所示,它就可以正常工作。

  before_save { |user| user.email = user.email.downcase }

我发现它的方法是在测试环境中加载rails控制台并尝试创建一个新用户。我注意到一切都很好,但电子邮件为空。

于 2012-09-28T01:35:38.503 回答
0

一般来说,您可以通过参考Rails 教程示例应用程序参考实现来调试此类问题。

于 2012-09-20T18:47:36.597 回答