2017-10-13 6 views
0

Ich versuche Unit-Test eine Controller-Methode mit Mocha + Chai + Sinon, aber ich habe Mühe zu verstehen, wie die Assertion mit diesen asynchronen Methoden funktioniert. Hier ist mein Test:Async-Test ruft nie fertig(), wenn Assertion fehlschlägt

it('should fetch all registered books and send them as json', (done) => { 
    res.json = sandbox.spy(); 
    const books = []; 

    BookMock.expects('find').withArgs() 
    .resolves(books); 

    booksController.index(req, res,() => { 
    res.json.should.have.been.calledWith(200, { data: books }); 
    done(); 
    }); 
}); 

Das Problem bei diesem Test ist, dass, wenn ich die Behauptung ändere ein 300 statt 200 Parameter, beispielsweise zu erwarten, wird mein Test stoppen (gescheitert) und nie done() nennen, was zu Ein generischer Fehler, der nichts weiter sagt als einen 'Test fehlgeschlagen, weil done nie aufgerufen wurde', was nichts über den Grund aussagt, dass der Test überhaupt fehlgeschlagen ist.

Wenn ich den Test so halte und meine Controller-Methode alles gut macht, ist der Test bestanden und alles ist in Ordnung, aber wenn der Controller etwas falsch macht, schlägt der Test fehl und sagt mir nicht den Grund dafür sollte sein "res.json wurde nicht mit bla bla bla Parameter aufgerufen").

Ich bin mir auch nicht sicher, das ist die richtige Methode, Test Controller-Methoden zu verbinden, da sie kein Versprechen zurückgeben Ich kann Chai-as-versprochene oder Versprechen Ketten überhaupt nicht verwenden, so habe ich die next() Rückruf verwendet (was immer mit restify aufgerufen wird), um die Behauptung zu machen, das könnte nicht richtig sein, also bin ich offen für einen vollständigen Refactor, um diesen Test am richtigsten zu machen.

Vielen Dank im Voraus!

Antwort

0

ein wenig Graben mehr Ich habe diese Antwort in anderer Frage gefunden: https://stackoverflow.com/a/26793989/4233017

ich meinen Code So aktualisiert und wickelte die Behauptung in einem try/catch, wie dies endet:

it('should fetch all registered books and send them as json', (done) => { 
    res.json = sandbox.spy(); 
    const books = []; 

    BookMock.expects('find').withArgs() 
    .resolves(books); 

    booksController.index(req, res,() => { 
    try { 
     res.json.should.have.been.calledWith(200, { data: books }); 
     done(); 
    } catch (e) { 
     done(e); 
    } 
    }); 
}); 

Jetzt, wenn der Test fehlschlägt, gibt es mir die richtige Fehlermeldung. Ich könnte es auch mit Booleans machen, wie die Antwort sagt, aber ich denke es ist besser so.

Jede andere Lösung wird immer noch sehr geschätzt.

Verwandte Themen