【问题标题】:Node.js with Express, Jest and SuperTest never fail带有 Express、Jest 和 SuperTest 的 Node.js 永远不会失败
【发布时间】:2020-04-17 00:25:20
【问题描述】:

我是 Jest 和 TDD 的新手。请帮我! 我正在使用 supertest 来请求 API,但即使服务器关闭,测试也永远不会失败。我试过使用 return 或 async 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"
}

src/server.js:

const app = require('./index')

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

src/index.js:

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

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

module.exports = app

src/routes.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)
    }
}}

测试/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.

【问题讨论】:

  • 您好!哪些测试会失败,为什么会失败?
  • 你好,andresmunozit!他们全部。服务器(Express)已关闭!

标签: node.js express jestjs tdd supertest


【解决方案1】:

哦,我知道问题出在哪里了,虽然不是真正的问题,但 Jest 和 Supertest 的正常行为。我给你解释一下。如果 Express 应用程序没有在监听,它不会影响 Jest 或 Supertest 行为。为什么?仅仅因为您传递给超测request(app)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 主进程是否仍在运行或已停止并不重要。

【讨论】:

  • 没用,@andresmunozit。您的重构建议我只留下了一个测试,并且行为完全相同。 console.log 显示数组:[ { name: 'John Doe', mail: 'john@mail.com' } ]。
  • 我已经编辑了我的答案,试图做到正确和清晰。希望能帮助到你。 :)
  • 哇,原谅我。我想我不是很清楚。我正在使用 supertest 向服务器发出请求。即使关闭了服务器,返回的状态仍然是 200。测试没有失败。
  • 当您运行测试脚本npm run test 时,Jest 运行并仅使用在src/index.js 中导出的应用程序,在其上运行测试并停止。当你说“Express 没有运行”时,你是在说这个脚本"start": "node src/server.js" 没有运行,但没关系。 Jest 在不同的脚本上运行,因此在不同的独立进程上运行测试并退出。 Jest 不需要运行 start 脚本来执行他的任务,因为它在不同的进程上执行它,即使它使用不同的脚本。
  • 在 Jest 的网站上,它明确表示“隔离测试通过在自己的进程中运行以最大化性能来并行化”jestjs.io/en
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 2014-01-24
相关资源
最近更新 更多