Mam node.js aplikację przy użyciu Express 4 i to jest mój kontroler:Jak przetestować funkcję, która wywołuje inną, która zwraca obietnicę?
var service = require('./category.service');
module.exports = {
findAll: (request, response) => {
service.findAll().then((categories) => {
response.status(200).send(categories);
}, (error) => {
response.status(error.statusCode || 500).json(error);
});
}
};
To nazywa moja usługa, która zwraca obietnicę. Wszystko działa, ale mam problemy podczas próby przetestowania go.
Zasadniczo chciałbym się upewnić, że na podstawie tego, co moja usługa zwróci, przepłucz odpowiedź odpowiednim kodem stanu i treścią.
Więc z mokka i sinon Wygląda to mniej więcej tak:
it('Should call service to find all the categories', (done) => {
// Arrange
var expectedCategories = ['foo', 'bar'];
var findAllStub = sandbox.stub(service, 'findAll');
findAllStub.resolves(expectedCategories);
var response = {
status:() => { return response; },
send:() => {}
};
sandbox.spy(response, 'status');
sandbox.spy(response, 'send');
// Act
controller.findAll({}, response);
// Assert
expect(findAllStub.called).to.be.ok;
expect(findAllStub.callCount).to.equal(1);
expect(response.status).to.be.calledWith(200); // not working
expect(response.send).to.be.called; // not working
done();
});
Ja testowałem moje podobne scenariusze, gdy funkcja I 'm testowania sam powróci obietnicę ponieważ mogę hak moje twierdzenia w czym.
Próbowałem również zawinąć controller.findAll z Obietnicą i rozwiązać go z response.send, ale to też nie zadziałało.
Każda funkcja, która wywołuje funkcję zwracającą obietnicę, jest asynchroniczna i powinna sama zwrócić obietnicę. Jeśli odbierasz tylko wywołania zwrotne, musisz wrócić do testowania interfejsu API opartego na oddzwanianiu. – Bergi
Czy używasz Chai? Jeśli tak, to http://chaijs.com/plugins/chai-as-promised/ –
Tak, ale funkcja, którą testuję, nie zwraca obietnicy o łańcuchu synów, ponieważ obiecany nie pomaga w zwykłym – jbernal