Рельсы 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, чтобы установить токен запоминания при первом создании пользователя

Другие вопросы по тегам