添加清单7.32 中提供的rspec测试后,rspec无法使用 find_by_email 方法返回User对象。 rspec测试失败并显示消息“ NoMethodError:nil的未定义方法名称:NilClass ”这实际上告诉我它找不到用户,因此没有返回User对象。任何洞察为什么这个特定的发现者方法失败而其他人工作将有所帮助。
我使用第7章示例部分开头提供的信息添加了一个用户,该部分为名称指定了“ Rails教程”,并且“ example@railstutorial.org “对于电子邮件。我还更改了rspec have_selector 方法,以匹配HTML h1 标记中的用户名称,而不是HTML 标题标签。如果我使用其他查找程序方法(例如 User.first 或 User.find(1),则rspec测试通过但是当我使用 User.find_by_email(“示例”时失败) @ railstutorial.org“)即可。如果我打开rails控制台(开发模式),我可以使用find_by_email方法返回正确的用户。如果我打开rails控制台(测试模式),则数据库中没有用户。我运行bundle exec rake db:test:prepare
并重新运行它,但rspec测试仍然失败。我可以在更改规范时使用 User.first 打印出正确的结果,并使用pp user.name, user.email
打印出名称和电子邮件但是当试图使用 User.find_by_email(“example@railstutorial.org”)时,rspec会丢失。
ruby 1.9,rails 3.2.3,Ubuntu 10.04
source 'https://rubygems.org'
gem 'rails', '3.2.3'
gem 'bootstrap-sass','2.0.0'
gem 'bcrypt-ruby','3.0.1'
group :development, :test do
gem 'sqlite3'
gem 'rspec-rails','2.9.0'
gem 'annotate', '~> 2.4.1.beta'
end
group :test do
gem 'capybara','1.1.2'
gem 'factory_girl_rails','1.4.0'
end
#Javascript runtime for Linux
gem 'therubyracer'
group :assets do
gem 'sass-rails', '~> 3.2.3'
gem 'coffee-rails', '~> 3.2.1'
gem 'uglifier', '>= 1.0.3'
end
gem 'jquery-rails'
class User < ActiveRecord::Base
attr_accessible :name, :email, :password, :password_confirmation
has_secure_password
before_save { self.email.downcase! }
validates :name, presence: true, length: {maximum:20}
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true,
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false}
validates :password, length: {minimum:6}
validates :password_confirmation, presence: true
end
describe "signup" do
before { visit signup_path }
let(:submit) { "Create my account" }
describe "with invalid information" do
it "should not create a user" do
expect { click_button submit }.not_to change(User, :count)
end
describe "after submission" do
before { click_button submit }
it { should have_selector('title',text: 'Sign up') }
it { should have_content('error') }
end
end
describe "with valid information" do
before do
fill_in "Name", with: "Example User"
fill_in "Email", with: "user@example.com"
fill_in "Password", with: "foobar"
fill_in "Confirmation", with: "foobar"
end
it "should create a user" do
expect { click_button submit }.to change(User, :count).by(1)
end
describe "after saving the user" do
before { click_button submit }
let(:user) { User.find_by_email("example@railstutorial.org") }
it { should have_selector('h1', text: user.name) #error with name on NilClass!
it { should have_selector('div.alert.alert-success', text: 'Welcome')}
end
end
end
答案 0 :(得分:1)
您使用email = user@example.com
填写表单,但尝试使用email = example@railstutorial.org
在您的数据库中找到该用户。让它们变得相同。
答案 1 :(得分:0)
您是否迁移了测试模式的迁移?如果不是这样,试试这个:
RAILS_ENV = test rake db:migrate