web-dev-qa-db-ja.com

superagent / supertestでHTTP呼び出しをチェーンする方法は?

スーパーテストでエクスプレスAPIをテストしています。

テストケースで複数のリクエストを取得して、スーパーテストを使用することはできませんでした。以下は、テストケースで試したものです。しかし、テストケースはHTTP GETである最後の呼び出しのみを実行するようです。

it('should respond to GET with added items', function(done) {
    var agent = request(app);
    agent.post('/player').type('json').send({name:"Messi"});
    agent.post('/player').type('json').send({name:"Maradona"});
    agent.get('/player').set("Accept", "application/json")
        .expect(200)
        .end(function(err, res) {
            res.body.should.have.property('items').with.lengthOf(2);
            done();
    });
);

ここで不足しているもの、またはスーパーエージェントでhttp呼び出しを連鎖する別の方法がありますか?

37
user3189921

呼び出しは非同期で行われるため、コールバック関数を使用してそれらをチェーンする必要があります。

it('should respond to GET with added items', function(done) {
    var agent = request(app);
    agent.post('/player').type('json').send({name:"Messi"}).end(function(){
        agent.post('/player').type('json').send({name:"Maradona"}).end(function(){
            agent.get('/player')
                .set("Accept", "application/json")
                .expect(200)
                .end(function(err, res) {
                    res.body.should.have.property('items').with.lengthOf(2);
                    done();
                });
        });
    });
});
23
harun

これを上記のコメントに入れようとしましたが、フォーマットはうまくいきませんでした。

私は非同期を使用しています。これは本当に標準であり、非常にうまく機能します。

it('should respond to only certain methods', function(done) {
    async.series([
        function(cb) { request(app).get('/').expect(404, cb); },
        function(cb) { request(app).get('/new').expect(200, cb); },
        function(cb) { request(app).post('/').send({prop1: 'new'}).expect(404, cb); },
        function(cb) { request(app).get('/0').expect(200, cb); },
        function(cb) { request(app).get('/0/edit').expect(404, cb); },
        function(cb) { request(app).put('/0').send({prop1: 'new value'}).expect(404, cb); },
        function(cb) { request(app).delete('/0').expect(404, cb); },
    ], done);
});
61
Tim

これはpromiseで最もエレガントに解決でき、supertestでpromiseを使用するための本当に便利なライブラリがあります: https://www.npmjs.com/package/supertest-as-promised

彼らの例:

return request(app)
  .get("/user")
  .expect(200)
  .then(function (res) {
    return request(app)
      .post("/kittens")
      .send({ userId: res})
      .expect(201);
  })
  .then(function (res) {
    // ... 
  });
13
Phil

私は ティムの返事 に基づいていましたが、async.waterfall代わりに、結果に対してテストを実行できるようにします(注:ここでは、Mochaの代わりに Tape を使用します)。

test('Test the entire API', function (assert) {
    const app = require('../app/app');
    async.waterfall([
            (cb) => request(app).get('/api/accounts').expect(200, cb),
            (results, cb) => { assert.ok(results.body.length, 'Returned accounts list'); cb(null, results); },
            (results, cb) => { assert.ok(results.body[0].reference, 'account #0 has reference'); cb(null, results); },
            (results, cb) => request(app).get('/api/plans').expect(200, cb),
            (results, cb) => request(app).get('/api/services').expect(200, cb),
            (results, cb) => request(app).get('/api/users').expect(200, cb),
        ],
        (err, results) => {
            app.closeDatabase();
            assert.end();
        }
    );
});
8
Tom Söderlund