当一个请求依赖于另一个时,您如何链接超级测试请求?

How can you chain supertest requests when one is dependent on the other?

所以现在输出是:

Warning: superagent request was sent twice, because both .end() and .then() were called. Never call .end() if you use promises
Warning: .end() was called twice. This is not supported in superagent
GET /api/things 200 3.009 ms - 2414
superagent: double callback bug
WARNING

问题是,我需要通过调用 .end() 返回的 res 对象来测试 ETag 功能。它永远不会进入第二个 .end() 并且不会打印出该控制台日志。

最里面的 .catch(done) 是被调用的。

it('should return things', done => {
  const promises = [];

  promises.push(Thing.create(testThing));
  promises.push(Thing.create(testThing));

  Promise.all(promises)
    .then(things => {
      request(app)
        .get('/api/things')
        .expect(200)
        .end((err, res) => {
          const etag = res.get('ETag')
          if (err)
            return done(err);
          request(app)
            .get('/api/things')
            .set('If-None-Match', etag)
            .expect(304)
            .end((err, res) => {
              console.log('are we able to make it back here?');
              expect(err).to.not.exist;
              expect(res.body.data).to.be.undefined;
              expect(res.get('ETag')).to.be.equal(etag);
              return done(err);
            })
        })
        .catch(done);
    })
    .catch(done);
});
});

有没有人知道为什么会发生这种情况,以及如何着手测试这样的事情?

我想通了,我正在做以下事情:

if (req.header('If-None-Match') === allThingsEtag) {
    // dont send allThings
    res.status(304);
}

我需要实际设置响应的主体,以便它知道 return 它,就像这样:

if (req.header('If-None-Match') === allThingsEtag) {
    // dont send allThings
    res.status(304);
    res.json();
}

我知道这非常适合我的情况,但万一有人遇到这个问题,这就是我必须想出的解决方案。所以也许检查你的 api 代码。

为了解决 .end() 被调用两次的问题,我将测试更改为使用 .then().

为此浪费了 1 小时。

官方文档不是很好:
https://www.npmjs.com/package/supertest

以下工作正常:

let request = require("supertest");
var assert = require("assert");
// const chai = require("chai");                     // can be chai instead of assert

describe("Run tests", () => {
  request = request("http://localhost:3001");        // must be here

  it("get", async () => {

    request
      .get("/")
      .expect("Content-Type", /json/)
      .expect(200)
      .then((response) => {                          // must be then, not a callback
        assert(response.body.data !== undefined);
      })
      .catch((err) => {
        assert(err === undefined);
      });

  });

});