1

我正在努力使用 supertest 解决我的玩笑测试中的一个错误,我认为这是我的测试而不是我的代码的问题。

我的问题

我正在尝试使用 node.js 创建后端 API,并使用 TDD 进行表达。我有以下文件来设置服务器:

//in app.js
const express = require('express');
const app = express();

app.post('api/1.0/users', (req, res) => {
  return res.send();
});

module.exports = app;

//in index.js
const app = require('./app');
const port = 3000;

app.listen(port, () => console.log(`listening on port: ${port}`));

当我运行服务器时,它在端口 3000 上成功运行。但是当我运行以下测试时:

//in UserRegister.test.js
const request = require('supertest');
const app = require('../app'); //this is in a __tests__ subdir hence '..'

it('returns 200 OK when sign-up request is valid', (done) => {
  request(app)
    .post('api/1.0/users')
    .send({
      first_name: 'person',
      last_name: 'one',
      password: '123',
    })
    .expect(200, done);
});

问题

我得到错误connect ECONNREFUSED 127.0.0.1:80

我认为这告诉我测试正在寻找连接到端口 80,但是端口 80 上没有设置服务器,因此连接被拒绝,但它应该尝试连接到端口 3000。

我尝试过的

  • 据我所知,所有软件包都已正确安装
  • 我尝试了一个让我的服务器监听端口 80 的 hacky 解决方案,但这引发了同样的问题。
  • 阅读超测试文档以尝试替代解决方案
  • 尝试了以下不同的语法,以防我误解了一个明显的语法问题:
it('returns 200 OK when sign-up request is valid', async () => {
  const response = await request(app).post('api/1.0/users')
  .send({
      first_name: 'person',
      last_name: 'one',
      password: '123',
    })
  expect(response.statusCode).toEqual(200);
});

我错过了什么?我越来越相信这是我对超测的工作原理缺乏了解,但我似乎无法理解问题所在。

我只是在寻找通过或失败的测试(通过获得 200 或 404 响应),但只有在它连接到正确的端口后(即我遇到了第一个障碍)。

4

1 回答 1

2

问题是URI。我刚刚尝试了一个 url 没有开始使用的测试/并得到了同样的错误。所以与其

.post('api/1.0/users')

使用

.post('/api/1.0/users')

可以解决问题。

于 2021-11-26T15:31:57.103 回答