摩卡:不能使用一个多个请求来测试

时间:2016-06-02 09:37:51

标签: mocha supertest vows

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命令的结果:

mocha error

如何申请网址一次并在多个it案例中使用。

1 个答案:

答案 0 :(得分:3)

解决方案

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

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

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

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

解释

如果您查看supertest的代码,则see当您使用回调呼叫expect方法时,expect会自动调用{{1} }}。所以这个:

end

相当于:

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

api.expect('Content-Type', /json/).end(done); 方法由superagent提供,end用于执行请求。 supertest方法启动了请求。这意味着您已完成设置请求并希望立即将其关闭。

end method调用request method,其任务是使用Node的网络机制来生成用于执行网络操作的Node请求对象。 问题是end缓存节点请求产生但该节点请求对象不可重用。因此最终,requestsuperagent请求无法结束两次。您必须重新发出每次测试的请求。

(您可以通过执行supertest手动刷新测试之间的缓存对象。但我强烈建议不要这样做。首先,无论您认为自己获得的任何优化都是最小的因为网络请求仍然需要重新制作。其次,这相当于弄乱api.req = undefined的内部。它可能会破坏未来的版本。第三,可能还有其他变量可能需要保持状态与superagent一起重置。)