web-dev-qa-db-fra.com

Comment chaîner les appels http avec superagent / supertest?

Je teste une API express avec supertest.

Je n'ai pas pu obtenir plusieurs demandes dans un scénario de test pour travailler avec le supertest. Voici ce que j'ai essayé dans un cas de test. Mais le cas de test semble exécuter uniquement le dernier appel qui est 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();
    });
);

Y a-t-il quelque chose qui me manque ici, ou existe-t-il une autre façon de chaîner les appels http avec superagent?

37
user3189921

Les appels sont effectués de manière asynchrone, vous devez donc utiliser des fonctions de rappel pour les enchaîner.

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

Cela peut être résolu de la manière la plus élégante avec des promesses, et il existe une bibliothèque très utile pour utiliser les promesses avec le supertest: https://www.npmjs.com/package/supertest-as-promised

Leur exemple:

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

Je me suis appuyé sur réponse de Tim mais j'ai utilisé async.waterfall à la place, pour pouvoir faire des tests d'affirmation sur les résultats (note: j'utilise Tape ici au lieu de Mocha):

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