В настоящее время я разрабатываю приложение RoR 4.Понимание тестов пользователей RSPEC в учебнике Ruby on Rails
В моем приложении я пытаюсь реализовать тесты пользователей, подобные учебнику Микаэля Хартла. Я хотел бы узнать несколько вещей о тесте уникальности eMail:
1 - Уникальность проверяется при фактическом написании в базе данных, не так ли?
При написании моего теста так же, как в учебнике, он неэффективен. @user = User.new (...) фактически создает экземпляр пользователя только в памяти. Следующий тест:
describe "when email address is already used" do
before do
user_with_same_email = @user.dup
user_with_same_email.save
end
it { should_not be_valid }
end
работает только в моем случае, когда @user = user.new (...) инструкция сопровождается инструкцией user.save. Я прав ?
Дополнительное примечание:, когда уникальная электронная почта реализована в пользовательской модели, она всегда терпит неудачу!?! Можете ли вы рассказать мне, что не так с этим тестом?
VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, uniqueness: true, length: { maximum: 100 }, format: { with: VALID_EMAIL_REGEX }
2 - Действительно ли RSPEC пишет в базу данных TEST?
После выполнения вышеуказанного теста (user.new (...) - user.save - user.dup - user.save), я проверяю «измененную дату» файла базы данных TEST SQLite3. При тестировании он не был затронут. Файлы spec_hepler.rb начинаются с:
ENV["RAILS_ENV"] ||= 'test'
Я что-то пропустил?
Спасибо за вашу помощь,
С наилучшими пожеланиями,
Фред
Спасибо за ваше объяснение по поводу SQLite, теперь ясно. – user1185081
О структуре тестирования уникальности, вы имеете в виду, что последовательность команд user1 = User.new() - user2 = user1.dup - user2.save действительно запускает тест уникальности при выполнении инструкции сохранения? – user1185081
@ user1185081: В рамках подготовки теста 'user2.save' запускает проверки, но условие уникальности считается выполненным в этой точке, поскольку' user1' еще не сохраняется в базе данных. Затем тест проверяет, действительно ли 'user1' - возвращает false (как и ожидалось), так как' user2' уже был сохранен с этим адресом электронной почты. – PinnyM