コジマです。
また、しょぼい理由でハマってしまいました。。
Railsチュートリアルの第6章を勉強していて、
リスト6.39のこれ
require 'test_helper' class UserTest < ActiveSupport::TestCase def setup @user = User.new(name: "Example User", email: "user@example.com", password: "foobar", password_confirmation: "foobar") end . . . end
これをテストしたら
$ rails test Running via Spring preloader in process 9083 Run options: --seed 28936 # Running: ..EEEEEEE..... Finished in 0.671107s, 20.8611 runs/s, 25.3313 assertions/s. 1) Error: UserTest#test_email_addresses_should_be_unique: ActiveModel::UnknownAttributeError: unknown attribute 'password' for User. test/models/user_test.rb:6:in `setup' 2) Error: UserTest#test_email_should_not_be_too_long: ActiveModel::UnknownAttributeError: unknown attribute 'password' for User. test/models/user_test.rb:6:in `setup' 3) Error: UserTest#test_email_validation_should_accept_valid_addresses: ActiveModel::UnknownAttributeError: unknown attribute 'password' for User. test/models/user_test.rb:6:in `setup' 4) Error: UserTest#test_should_be_valid: ActiveModel::UnknownAttributeError: unknown attribute 'password' for User. test/models/user_test.rb:6:in `setup' 5) Error: UserTest#test_email_should_be_present: ActiveModel::UnknownAttributeError: unknown attribute 'password' for User. test/models/user_test.rb:6:in `setup' 6) Error: UserTest#test_email_validation_should_reject_invalid_addresses: ActiveModel::UnknownAttributeError: unknown attribute 'password' for User. test/models/user_test.rb:6:in `setup' 7) Error: UserTest#test_name_should_not_be_too_long: ActiveModel::UnknownAttributeError: unknown attribute 'password' for User. test/models/user_test.rb:6:in `setup' 14 runs, 17 assertions, 0 failures, 7 errors, 0 skips
えぇぇぇぇえぇ。。。
エラーじゃん…。
UnknownAttributeErrorってことは知らん属性がいるぞ、と。
passwordってやつを知らんらしい。
トラブルシューティングや…。
$ bundle list | grep bcrypt * bcrypt (3.1.11)
bcryptはインストールされている。
bcrypt入れる前のファイルに戻してみるか…。
class User < ApplicationRecord before_save { self.email = email.downcase } validates :name, presence: true, length: { maximum: 50 } VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i validates :email, presence: true, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false } #has_secure_password end
def setup #@user = User.new(name: "Example User", email: "user@example.com", # password_digest: "foobar", password_confirmation: "foobar") @user = User.new(name: "Example User", email: "user@example.com") end
テストが通る。。。
$ rails test Running via Spring preloader in process 11074 Run options: --seed 21380 # Running: .............. Finished in 0.689584s, 20.3021 runs/s, 46.4048 assertions/s. 14 runs, 32 assertions, 0 failures, 0 errors, 0 skips
もう一度リスト6.37の状態にして。。
class User < ApplicationRecord before_save { self.email = email.downcase } validates :name, presence: true, length: { maximum: 50 } VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i validates :email, presence: true, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false } has_secure_password end
これはREDだから。。
$ rails test Running via Spring preloader in process 11074 Run options: --seed 21380 # Running: .............. Finished in 0.689584s, 20.3021 runs/s, 46.4048 assertions/s. 14 runs, 32 assertions, 0 failures, 0 errors, 0 skips
あれ????
testが通る…なぜだ…。
この時点でなにかおかしいということになりますな。。。
modelのuser.rbを呼び直してみる
class User < ApplicationRecord validates :name, presence: true, length: { maximum: 50 } VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i validates :email, presence: true, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false } end
あれ、has_secure_passwordがない。
ちゃんと修正が反映されてなかっただけみたい(泣)
その後問題が解決しました…。
予期せぬ動きをしたら、ファイルの修正が反映されているか確かめる癖つけなきゃダメですね。。
もっと実りあるいい記事を書きたかったのですが、こんなしょぼいことで申し訳ないです。。
無駄に時間使ってしまった。。。
先に進まないとぉぉぉ。。
以上です。コジマでした。