2015-04-17 2 views
3

У меня есть модель User, в которой есть крючок beforeCreate, который шифрует пароль, используя bcrypyt. Bcrypyt загружается как зависимость по модели с использованием инструкции require.Sequelize Model Unit Test

Теперь я пишу свои тесты для своих моделей, и я хочу написать тест, который гарантирует, что bcrypt хеширует пароль при создании.

На данный момент я добавил сеттера на модель User, которая устанавливает объект bcrypt. В моих тестах я могу создать шпиона, используя sinon и ввести шпиона, используя установщик, и убедиться, что он вызван при создании.

Правильно ли это делается? Мне кажется, что я создаю сеттер исключительно для своих тестов и что он не служит никакой другой цели.

ответ

6

Как проверить, является ли предметом религиозных дебатов в сообществе разработчиков. Я придерживаюсь мнения, что до тех пор, пока вы испытываете, точно, как это делается, это вопрос предпочтения. Я стараюсь писать тесты, которые ведут себя как мое приложение как можно больше.

Если вы хотите, чтобы bcrypt правильно хранил пароль пользователя при создании, затем создайте пользователя, сохраните его и проверьте пароль.

Это может быть больше работы с проверкой тестовой базы данных для тестов, но я считаю, что она дает хорошие результаты. И настройка и срыв очень удобны для написания сценариев.

Для этого примера вам даже не нужна тестовая среда для проверки этого поведения.

var User = require('./User') 
var BCRYPT_HASH_BEGINNING = '$2a$' 
var TEST_PASSWORD = 'hello there' 

User.create({ password: TEST_PASSWORD }).then(function(user){ 
    if(!user) throw new Error('User is null') 
    if(!user.password) throw new Error('Password was not saved') 
    if(user.password === TEST_PASSWORD) 
    throw new Error('Password is plaintext') 
    if(user.password.indexOf(BCRYPT_HASH_BEGINNING) === -1) 
    throw new Error('Password was not encrypted') 
}) 
+0

За исключением того, что этот тест оставит вашу базу данных в грязном состоянии; после этого вы не очищаете. – Jez

+1

@Jez 'И установка и срыв очень удобны для написания сценариев' – JoshWillik

+1

Пока тест не сработает, и по какой-то причине срыв не может работать. – Jez