2017-09-07 3 views
0

So jetzt ist die Ausgabe:Wie können Sie Supertest-Anfragen verketten, wenn einer von dem anderen abhängig ist?

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 

Die Sache ist, ich brauche das res Objekt, das ich von wieder .end(), um den Aufruf der ETag Funktionalität zu testen. Es geht nie in die zweite .end() und druckt dieses Konsolenprotokoll nicht aus.

Der innerste .catch(done) ist derjenige, der aufgerufen wird.

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); 
}); 
}); 

Hat jemand irgendwelche Ideen, warum dies passieren könnte, und wie man so etwas testet?

Antwort

0

ich es herausgefunden, ich habe die folgenden Schritte ausführen:

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

ich brauchte, um den Körper der Antwort tatsächlich so eingestellt, dass sie es zurückgeben wusste, etwa so:

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

I Ich weiß, dass das für meinen Fall unglaublich spezifisch ist, aber wenn jemand zufällig darauf reinkommt, dann ist das die Lösung, die ich mir ausgedacht habe. Also, überprüfe vielleicht deinen API-Code.

Um das .end() zu umgehen, das zweimal Problem genannt wird, änderte ich meine Tests, um zu verwenden.

+0

Ich weiß, dass Sie das bereits gelöst haben, aber Sie hätten auch die Funktion 'sendStatus' verwenden können, wenn Sie nicht explizit eine JSON-Antwort und einen Inhaltstyp benötigen. 'res.sendStatus (304);' – Mikelax

Verwandte Themen