mocha:不能对多个 `it` 测试使用一个请求

mocha: can't use one request for mutlple `it` test

const request = require('supertest');

const server = request('http://localhost:9001');

describe('Get /static/component-list.json', function() {
    const api = server.get('/static/component-list.json');

    it('should response a json', function(done) {
        api.expect('Content-Type', /json/, done);
    });
    it('200', function(done) {
        api.expect(200, done); // This will failed
        // server.get('/static/component-list.json').expect(200, done); // This will successed
    });
});

在第二个测试用例中重用 api 时,mocha 将引发错误:

mocha test/api命令的结果:

如何请求 url 一次并在多个 it 情况下使用。

解决方案

您必须为您想要 运行 的每个测试(每个 it)创建一个新请求。您不能对多个测试重复使用相同的请求。所以

describe('Get /static/component-list.json', function() {
    let api;

    beforeEach(() => {
        api = server.get('/static/component-list.json');
    });

或者,如果您想减少发出的请求数量,则将您对请求的所有检查合并到一个 Mocha 测试中。

说明

如果您查看 supertest 的代码,您会 see 当您调用带有回调的 expect 方法时,expect 调用会自动调用 end。所以这个:

api.expect('Content-Type', /json/, done);

相当于:

api.expect('Content-Type', /json/).end(done);

end 方法由 superagent 提供,这是 supertest 用来执行请求的方法。 end 方法是启动请求的方法。这意味着您已完成请求设置,现在想将其关闭。

end method calls the request method,其任务是使用 Node 的网络机制生成用于执行网络操作的 Node 请求对象。 问题是 request 缓存了生成的节点请求,但此节点请求对象不可重用。 所以最终,superagentsupertest 请求不能结束两次。您必须为每个测试重新发出请求。

(您可以通过执行 api.req = undefined 在测试之间手动刷新缓存的对象。但我强烈建议不要这样做。 一方面,无论您认为什么优化'd get 是最小的,因为网络请求仍然需要重新进行。其次,这相当于弄乱了 superagent 的内部结构。它可能会在未来的版本中中断。第三,可能还有其他变量保持状态可能需要与 req 一起重置。)