Рельсы Remember_token ожидали черного цвета? вернуть ложь, вернуть истину
Я в Хартл Ч. 8 Rails Tutorial и мой тест "запомнить токен" не пройдены. Сообщение об ошибке
User remember token
Failure/Error: it { @user.remember_token.should_not be_blank}
expected black? to return false, got true
Тестовый код
describe "remember token" do
before { @user.save }
it { @user.remember_token.should_not be_blank }
end
Модельный метод
def create_remember_token
self.remember_token = SecureRandom.urlsafe_base64
end
Есть идеи, почему это не работает? Благодарю.
2 ответа
Не зная, как вы настраиваете остальную часть вашей модели, или если это должно происходить только один раз или при каждом сохранении, дизайн может измениться. Это будет зависеть от того, как вы настроите ловушку, которая вызывает create_remember_token
,
Предполагая, что вы всегда хотите убедиться, что токен существует, вы можете форсировать, если перед сохранением:
class User < ActiveRecord::Base
before_save :create_remember_token
# Rest of code
def create_remember_token
# Only create this if it doesn't already exist
self.remember_token = SecureRandom.urlsafe_base64 unless remember_token
end
end
Для более точных тестов я бы использовал:
describe User do
subject(:user) { User.new } # Omitting required attributes
context "on saving" do
it do
SecureRandom.stub(urlsafe_base64: "test_token")
expect{user.save}.to change{user.remember_token}.from(nil).to("test_token")
end
end
end
Если вы следуете за Хартлом, я думаю, что вы действительно хотите:
class User < ActiveRecord::Base
before_create :create_remember_token
Для этого мы создадим исходный токен, используя обратный вызов, метод, представленный в разделе 6.2.5 в контексте уникальности электронной почты. В этом разделе мы использовали обратный вызов before_save; на этот раз мы будем использовать тесно связанный обратный вызов before_create, чтобы установить токен запоминания при первом создании пользователя