今回から、自分用にメモを残すことにした。きっと何かの機会に役立つ...はず。
##Rakeが実行できなくなる
マイグレーション後に、Rakeが実行できなくなることがあるらしい。
データベースが壊れた場合、リセットが必要。
その場合はrake db:test:prepare
を実行することで、解決できる。
##6章でハマったところ。
リスト6.28の、パスワードの長さとauthenticateメソッドのテストのとき。
user_spec.rb
require 'spec_helper'
describe User do
before do
@user = User.new(name: "Example User", email: "user@example.com",
password: "foobar", password_confirmation: "foobar")
end
subject { @user }
.
.
.
it { should respond_to(:authenticate) }
.
.
.
describe "with a password that's too short" do
before { @user.password = @user.password_confirmation = "a" * 5 }
it { should be_invalid }
end
describe "return value of authenticate method" do
before { @user.save }
let(:found_user) { User.find_by(email: @user.email) }
describe "with valid password" do
it { should eq found_user.authenticate(@user.password) }
end
describe "with invalid password" do
let(:user_for_invalid_password) { found_user.authenticate("invalid") }
it { should_not eq user_for_invalid_password }
specify { expect(user_for_invalid_password).to be_false }
end
end
end
specify { expect(user_for_invalid_password).to be_false }
この部分だけテストが通らなかった。
Failures:
- User return value of authenticate method with invalid password should be false
Failure/Error: specify{ expect(user_for_invalid_password).to be_false }
expected false to respond to `false?`
# ./spec/models/user_spec.rb:91:in `block (4 levels) in <top (required)>`
という感じに。
見た感じ、打ち間違いもないし...とあーだこーだした結果。
RSpec3.0以降は最後のbe_false
の部分をbe_falsy
と書かなければならないらしい。
書き換えたら、無事、解決。
##6章で紹介されたメソッド
method | action |
---|---|
respond_to? | シンボルを1つ引数として受け取り、オブジェクトが応答する場合はtrue、応答しない場合はfalseを返す。 |
valid? | オブジェクトが一つ以上の検証に失敗した時にfalseを返す。全ての検証がパスした場合はtrueを返す。 |
authenticate | 受け取ったパスワードがユーザーのものと一致した場合ユーザーが返され、一致しなかった場合はfalseを返す。 |