Estoy tratando de aprender cómo hacer una API RESTful siguiendo el paradigma TDD leyendo un libro sobre el tema (está en brasileño):
El autor recomienda el uso de sinon.js junto con mocha.js .
Me estoy acercando al final, pero no puedo pasar la prueba para mi gnomeController .
El problema es que estoy usando sinon para afirmar que estoy llamando al método get de gnomeController usando el objeto de respuesta dado, que en realidad es un espía.
Este espía es para asegurarse de que llame al método de respuesta con un "Error", pero parece que estoy llamando a la respuesta sin ningún tipo de argumento, lo cual es muy confuso.
gnomeController.js
module.exports = aGnomeModel => { let Gnome = aGnomeModel; function get(req, res){ return Gnome.find({}) .then(gnomes => res.send(gnomes)) .catch(err => res.status(400).send(err)); } return Object.freeze({ get }); };gnomeTest.js
const sinon = require("sinon"); const gnomesControllerFactory = require("gnomesController.js"); const Gnome = require("gnomeModel.js"); describe("Controllers: Gnomes", () => { describe("get() gnomes", () => { it("should return 400 when an error occurs", () => { const request = {}; const response = { send: sinon.spy(), status: sinon.stub() }; response.status.withArgs(400).returns(response); Gnome.find = sinon.stub(); Gnome.find.withArgs({}).rejects("Error"); const gnomesController = gnomesControllerFactory(Gnome); return gnomesController.get(request, response) .then(arg => { console.log(arg); sinon.assert.calledWith(response.send, "Error"); }); }); }); });Estoy usando las últimas versiones de ambas bibliotecas.
Después de mucha depuración, descubrí que la solución es reemplazar:
function get(req, res){ return Gnome.find({}) .then(gnomes => res.send(gnomes)) .catch(err => res.status(400).send(err)); }con:
function get(req, res){ return Gnome.find({}) .then(gnomes => res.send(gnomes)) .catch(err => res.status(400).send(err.name)); }Cosa que no se explica en el libro. Me gustaría poder dar más comentarios al respecto, pero hasta ahora es lo que es.