Мы уже создали наш сервер, 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 — здесь.