【问题标题】:The difference between axios and supertest in NodeJSNodeJS中axios和supertest的区别
【发布时间】:2020-07-20 08:30:13
【问题描述】:

Axios 和 Supertest 都可以向服务器发送 HTTP 请求。但是为什么Supertest用来测试,而Axios用来练习API调用呢?

【问题讨论】:

  • Supertest是用来测试的,因为它增加了一个测试API,你问的是Axios和Superagent的对比吗?
  • 不,这是对的。是关于超测的。我不知道为什么人们使用supertest来测试他们的http服务器而axios可以发送http请求
  • 因为 Supertest 可以“为测试 HTTP 提供高级抽象”;您可以使用 Axios 或任何其他可以发送请求的工具(例如直接发送请求)进行测试,但是您必须自己编写所有断言。
  • 啊,这就是为什么大多数人使用JestSupertest。谢谢你。但我想我已经看到Jest 本身也有请求功能。不是吗?我的意思是jest.fn()
  • 还有一个普通的请求库,你还必须自己启动应用程序,因为你不会再有request(app) 来做这件事了。

标签: node.js axios supertest


【解决方案1】:

使用 Supertest 而不是像 Axios(或 Superagent,Supertest 包装的)这样的普通请求库有两个原因:

  1. 它为您管理启动和绑定应用程序,使其可用于接收请求:

    您可以将http.ServerFunction 传递给request() - 如果 服务器尚未侦听连接,则它绑定到 为您提供临时端口,因此无需跟踪端口。

    没有这个,你必须自己启动应用程序并设置端口。

  2. 它添加了expect 方法,它允许您对响应做出许多常见的断言,而无需自己写出来。例如,而不是:

    // manage starting the app somehow...
    
    axios(whereAppIs + "/endpoint")
      .then((res) => {
        expect(res.statusCode).toBe(200);
      });
    

    你可以写:

    request(app)
      .get("/endpoint")
      .expect(200);
    

【讨论】:

  • 哇,这说明了我到底想知道什么!完美对比,谢谢!
  • 我看到了 axios 的第一个示例,它更加简洁易懂。当您用英语说“我期望响应状态为 200”时,它比您说“我期望 200”要清晰得多,那么 200 是什么意思?
  • @Anas 然后使用那个版本,超级测试不是强制性的。请注意,您也可以这样做.then(({ status }) => { expect(status).toBe(200); }) 超测 如果你愿意的话。在任何版本中,您还可以使用 HttpStatus.OK 之类的别名,而不是幻数。
【解决方案2】:

因为Supertest 提供了一些axios 没有提供的断言API。所以人们通常使用Supertest来做http断言测试。

例如

const request = require('supertest');

describe('GET /user', function() {
 it('responds with json', function(done) {
   request(app)
     .get('/user')
     .auth('username', 'password')
     .set('Accept', 'application/json')
     .expect('Content-Type', /json/)
     .expect(200, done);
 });
});

【讨论】:

  • 这是人们使用 Supertest 的唯一原因吗?我认为也可以通过Axiosrequest或其他http请求库来完成。
  • 如果您使用 axios 或 request 需要通过其他工具进行断言。
  • 感谢您的快速回复!它也对我很有帮助:)
猜你喜欢
  • 2020-07-30
  • 2018-12-15
  • 2017-11-21
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 2017-04-12
  • 1970-01-01
相关资源
最近更新 更多