node.js - 使用 chai-http 和 Jest 进行测试时,如何从 api 返回响应

标签 node.js unit-testing jestjs web-api-testing chai-http

我正在尝试使用下面的代码测试我的 Node api 索引端点

index.test.js

const chai = require('chai')
const chaiHttp = require('chai-http')
const server = 'http://localhost:8000'

chai.use(chaiHttp)

describe('set up test', () => {
 it('set up test', () => {
   expect(1).toEqual(1)
 })
})

describe('index route test', () => {
 it('index route test', (done) => {
  const { res } = chai
    .request(server)
    .get('/')
    .end((res) => {
      expect(res.statusCode).toBe(200)
      done()
    })
  console.log(res)
 })

})

  1. 我的“索引路由测试”失败测试通过了,但它应该会失败(已解决)。
  2. 收到的响应未定义(我在控制台中记录)。

我的输出如下:

输出

> jest --forceExit || true

FAIL  tests/index.test.js
 set up test
   ✓ set up test (6 ms)
 index route test
   ✕ gives welcome message (49 ms)

 ● index route test › gives welcome message

   expect(received).toBe(expected) // Object.is equality

   Expected: 200
   Received: undefined

     18 |       .get('/')
     19 |       .end((res) => {
   > 20 |         expect(res.statusCode).toBe(200)
        |                                ^
     21 |         done()
     22 |       })
     23 |     console.log(res)

     at tests/index.test.js:20:32
     at Test.Object.<anonymous>.Request.callback (node_modules/superagent/lib/node/index.js:728:3)
     at ClientRequest.<anonymous> (node_modules/superagent/lib/node/index.js:647:10)

 console.log
   undefined

     at Object.<anonymous> (tests/index.test.js:23:13)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 passed, 2 total
Snapshots:   0 total
Time:        1.63 s, estimated 2 s
Ran all test suites.
Force exiting Jest: Have you considered using `--detectOpenHandles` to detect async operations that kept running after all tests finished?

如何返回回复?

最佳答案

通过将应用程序 URL 传递给服务器变量,我没有得到任何响应。因此,我将语法更改为 ES6 import 而不是 require,并使用 app 模块而不是应用程序服务器的 url,如 chai-http 文档 here 中所示。

所以我的代码结构转变为

import chai from 'chai'
import chaiHttp from 'chai-http'
import server from '../app'

chai.use(chaiHttp)

describe('set up test', () => {
  it('set up test', () => {
   expect(1).toEqual(1)
  })
})

describe('index route test', () => {
  it('gives welcome message', (done) => {
    chai
     .request(server)
     .get('/')
     .then((res) => {
       expect(res.statusCode).toBe(200)
       done()
     })
   })
})

这样,我就可以捕获响应来对其进行检查。我的测试通过并且需要。输出为:

> jest --forceExit || true

PASS  tests/index.test.js
 set up test
   ✓ set up test (4 ms)
 index route test
   ✓ gives welcome message (77 ms)

 console.log
   Application Server is up and running on port 8000

     at Server.<anonymous> (app.js:43:11)

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        3.189 s
Ran all test suites.
Force exiting Jest: Have you considered using `--detectOpenHandles` to detect async operations that kept running after all tests finished?

关于node.js - 使用 chai-http 和 Jest 进行测试时,如何从 api 返回响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65598586/

相关文章:

javascript - 当客户端调用断开连接时,Socket.io 服务器未收到 'disconnect' 事件

过程或函数式编程语言中的单元测试

Android:在仪器测试中获取对启动服务的引用

visual-studio-code - Intellisense for Jest在VS代码中不起作用

javascript - Jest 报告测试通过,即使 expect 断言失败

node.js - wiredep 返回的路径一目录太深

node.js - 'SyntaxError : Unexpected token' after migration to different platform

unit-testing - 使用 Clojure 对 Java 进行单元测试

reactjs - global.location 在 Jest 测试中不起作用

node.js - 如何使用 Google PubSub (@google-cloud/pubsub) 进行 ACK