Node.js с Express, Jest и SuperTest никогда не подводят - PullRequest
1 голос
/ 16 апреля 2020

Я новичок в Jest и TDD. Пожалуйста, помогите мне! Я использую supertest для запроса API, но даже при выключенном сервере тесты никогда не заканчиваются. Я пытался использовать return или asyn c await, и это не решено

У меня есть следующая структура в Node.js проекте:

nodemodules
src
    controllers
        users-controller.js
    index.js
    routes.js
    server.js
test
    user.test.js
package.json

package. json:

"scripts": {
    "test": "jest",
    "lint": "eslint src/** test/** --fix",
    "start": "node src/server.js",
    "jest-watch": "jest --watch"
},
"devDependencies": {
    "eslint": "^6.8.0",
    "jest": "^25.3.0",
    "supertest": "^4.0.2"
},
"dependencies": {
    "body-parser": "^1.19.0",
    "express": "^4.17.1"
}

источник / сервер. js:

const app = require('./index')

app.listen(3001, () => {
    console.log('Server running on port 3001')
})

источник / индекс. js:

const express = require('express')
const routes = require('./routes')
const app = express()

app.use(express.json())
app.use(routes)

module.exports = app

источник / маршруты. js

const routes = require('express').Router()
const UserController = require('./controllers/users-controller')

routes.get('/', (req, res) => { res.status(200).send() })
routes.get('/users', UserController.findAll)
routes.post('/users', UserController.create)

module.exports = routes

src / controllers / user-controller. js

module.exports = {
    findAll(req, res) {
        const users = [
            { name: 'John Doe', mail: 'john@mail.com' }
        ]
        return res.status(200).json(users)
    },

    create(req, res) {
        return res.status(201).json(req.body)
    }
}}

test / user.test. js:

const request = require('supertest')
const app = require('../src/index')


test('Should list users', () => {
    return request(app).get('/users')
        .then(res => {
            expect(res.status).toBe(200)
            expect(res.body).toHaveLength(1)
            expect(res.body[0]).toHaveProperty('name', 'John Doe')
        })
})

test('Should insert a user', async () => {
    await request(app).post('/users')
        .send({ name: 'Walter Mitty', email: 'walter@mail.com' })
        .then(res => {
            expect(res.status).toBe(201)
            expect(res.body.name).toBe('Walter Mitty')
        })
})

И результат всегда одно и то же:

PASS  test / user.test.js
✓ Should list users. (16ms)
✓ Should insert a user. (13ms)

Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 0.456s, estimated 1s
Ran all test suites related to changed files.

Watch Usage: Press w to show more.

1 Ответ

0 голосов
/ 16 апреля 2020

О, я вижу, в чем проблема, хотя на самом деле это не проблема, это нормальное поведение Jest и Supertest. Я объясню тебе. Если приложение Express не слушает, оно не влияет на поведение Jest или Supertest. Почему? Просто потому, что app, который вы передаете в супер-тест request(app), запускает независимый процесс приложения, и когда тесты завершаются, это приложение также завершается. Другими словами, Supertest запускает приложение Express в другом процессе, выполняет тесты и завершает этот процесс.

Этот тест не пройден, если вы ожидаете другой код ответа, например 400. Следующий тест должен точно не получится:

test('Should list users', async () => {
    // First assertion
    const response = await request(app)
        .get('/users')
        .send()
        .expect(400) // This will make fail, because the app instance running for test, is working just fine and will return 200, if you expect a different code, so the test will fail

    // Second assertion
    expect(response.body[0]).toHaveProperty('name', 'John Doe')
})

Так что это нормальное поведение Jest и Supertest. Он запускает приложение Express, просто для запуска тестов, в другом независимом процессе. Не имеет значения, работает ли ваш основной процесс Express или он остановлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...