【发布时间】:2014-02-16 08:40:29
【问题描述】:
刚刚将bcrypt 和password_digest 列添加到数据库。现在我收到了这个错误。它说它不认识名字,这个测试通过了。现在它失败了。所有其他测试都通过了(包括password_digest 之一,很奇怪)。我使用的是rails自带的测试框架。
def test_can_create_profiles
user = create_user('tester@test.com', 'hassan') #creates a profile with randomized password
assert_equal "hassan", User.find_by_email('tester@test.com').name
end
捆绑 exec rake 测试
1) Error:
UserTest#test_can_create_profiles:
NoMethodError: undefined method `name' for nil:NilClass
test/models/user_test.rb:9:in `test_can_create_profiles'
class User < ActiveRecord::Base
email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
before_save {self.email = email.downcase}
validates :name, presence: true, length: { maximum: 20 }
validates :email, :presence => true,
:format => { :with => email_regex },
:uniqueness => { :case_sensitive =>
false }
has_secure_password
end
如果有任何我遗漏的信息请告诉我。
def create_user(email, name)
user = User.new(name: name, email: email)
user.password_digest = (0...8).map { (65 + rand(26)).chr }.join
user.save
user
end
哎呀
x = User.new
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil, password_digest: nil>
irb(main):002:0> x.name ='lol'
=> "lol"
irb(main):005:0> x.email = 'apple@ape.com'
=> "apple@ape.com"
irb(main):007:0> x.password_digest = 'lol'
=> "lol"
irb(main):008:0> x.save
(0.1ms) begin transaction
User Exists (0.3ms) SELECT 1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER('apple@ape.com') LIMIT 1
(0.1ms) rollback transaction
=> false
好的,问题出在这儿!
irb(main):010:0> raise x.errors.inspect
RuntimeError: #<ActiveModel::Errors:0x007f6fae5b3bf8 @base=#<User id: nil, name: "lol", email: "apple@ape.com", created_at: nil, updated_at: nil, password_digest: "lol">, @messages={:password=>["can't be blank"]}>
irb(main):013:0> raise x.password= 'hello'
RuntimeError: hello
from (irb):13
from /home/user/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/railties-4.0.1/lib/rails/commands/console.rb:90:in `start'
from /home/user/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/railties-4.0.1/lib/rails/commands/console.rb:9:in `start'
from /home/user/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/railties-4.0.1/lib/rails/commands.rb:62:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'
irb(main):014:0> raise x.errors.inspect
RuntimeError: #<ActiveModel::Errors:0x007f6fae5b3bf8 @base=#<User id: nil, name: "lol", email: "apple@ape.com", created_at: nil, updated_at: nil, password_digest: "$2a$10$CMPQdQSLKQTS5r0G2a1oheDhblzxcp65KxStZbKKAHmy...">, @messages={:password=>["can't be blank"]}>
from (irb):14
from /home/user/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/railties-4.0.1
呃:c
为什么会这样?
编辑:bcrypt 需要填写密码和密码确认字段。
这就是造成麻烦的原因,也是测试失败的原因。 >.
【问题讨论】:
-
向我们展示您的 create_user 方法 - 看起来它正在创建未保存到数据库的无效用户。
-
你是对的,它没有保存。我只是试图从控制台做到这一点! :c 不知道为什么
-
在
user.save之后添加raise user.errors.inspect你应该明白为什么了。 :)
标签: ruby-on-rails ruby unit-testing