Мы уже создали наш сервер, API и настроили тестовую среду. Теперь пришло время написать первый настоящий тест: давайте проверим правильность входа пользователя!
Добавьте 2 новые задачи в package.json и исправьте тест:
"scripts": { "test": "cross-env MONGOURL=mongodb://localhost:27017/nodejs_jestsupertestmongodb_example_test NODE_ENV=test jest --testTimeout=10000", "migrate:reset": "cross-env NODE_ENV=test MONGOURL=mongodb://localhost:27017/nodejs_jestsupertestmongodb_example_test node ./test/test_migrate.js", "pretest": "npm run migrate:reset" }
Когда мы запустим npm test, будет выполнена задача предварительного тестирования. Он установит test как NODE_ENV, а затем запустит задачу migrate:reset. Это необходимо, потому что мы не хотим возиться с базой данных разработки; задача установила базу данных в Mongo для тестовой среды, а затем запустила скрипт узла (test_migrate.js).
Теперь нам нужно написать этот скрипт, который представляет собой простой скрипт NodeJS с использованием Mongoose, чтобы удалить нашу (тестовую) базу данных и создать некоторые поддельные данные:
const mongoose = require(‘mongoose’) const User = require(‘../models/User’) const Post = require(‘../models/Post’) async function createFakeUsers () { const u = new User({ email: ‘[email protected]’, password: ‘fake’ }) await u.save() const uf = new User({ email: ‘[email protected]’, password: ‘fake’ }) await uf.save() } async function createFakePosts() { const u = await User.findOne({ email: ‘[email protected]’ }) const post = new Post({ title: ‘test edit post title’, user: u }) await post.save() const postToDelete = new Post({ title: ‘test delete post title’, user: u }) await postToDelete.save() } mongoose.connect(process.env.MONGOURL, { useNewUrlParser: true }) mongoose.connection.on(‘connected’, async () => { console.log(‘MongoDB connection established successfully with test’) await mongoose.connection.db.dropDatabase() await createFakeUsers() await createFakePosts() process.exit() })
После запуска теста npm, если вы посмотрите на свою MongoDB, вы увидите, что база данных и коллекции были созданы и заполнены:
Давайте проверим нашу конечную точку входа (POST /users/sign_in). Создайте каталог с именем controllers/ внутри теста и там файл user.test.js.
Что нам нужно сделать:
- импортировать шуточный фреймворк
- тестовая функция, которая будет выполнять запрос POST и проверять ответ
- перед всеми тестами запускаем сервер
- после всех тестов закрыть сервер
Источник:
const request = require('supertest'); let app; describe('User Authenticated Endpoints', () => { beforeAll(async () => { app = require('../../app') }) afterAll(async () => { await app.close() }) it('should try to do login with valid credentials and success', async () => { const res = await request(app) .post('/users/signin') .send({ email: '[email protected]', password: 'fake' }) expect(res.statusCode).toEqual(200) expect(res.body).toHaveProperty('token') }) })
Если вы снова запустите тест, то увидите в консоли:
Test Suites: 2 passed, 2 total Tests: 2 passed, 2 total Snapshots: 0 total Time: 2.092s Ran all test suites.
Иногда вместо него в файле вы увидите test; это просто псевдоним, который команда Jest использует во фреймворке, потому что его используют другие тестовые фреймворки.
Что мы тестируем? Запрос POST к конечной точке входа, отправка (поддельных) учетных данных пользователя, и ответ должен иметь статус 200, а тело должно иметь токен.
Давайте также добавим тест на недействительные учетные данные:
it('should try to do login with invalid credentials and fail', async () => { const res = await request(app) .post('/users/signin') .send({ email: '[email protected]', password: 'fake' }) expect(res.statusCode).toEqual(401) })
Полный и обновленный исходный код проекта находится на Github, а точная версия из этого поста на Medium — здесь.