node.js - unit - tdd nodejs
Trocear un modelo Mongoose con Sinon (4)
Quiero crear un stub para el método de guardado de Mongoose en un modelo particular, de modo que cualquier instancia de mi modelo que creo llame al stub en lugar del método de guardado de Mongoose normal. Según entiendo, la única forma de hacerlo es apuntar todo el modelo así:
var stub = sinon.stub(myModel.prototype);
Desafortunadamente, esta línea de código arroja el siguiente error:
TypeError: Cannot read property ''states'' of undefined
¿Alguien sabe qué está mal aquí?
Echa un vistazo a sinon-mongoose . Puede esperar métodos encadenados con solo unas pocas líneas:
sinon.mock(YourModel).expects(''find'')
.chain(''limit'').withArgs(10)
.chain(''exec'');
Puede encontrar ejemplos de trabajo en el repositorio.
Además, una recomendación: use el método mock
lugar del stub
, que comprobará que el método realmente existe.
En lugar de todo el objeto, intente:
sinon.stub(YOURMODEL.prototype, ''save'')
Asegúrate de que YOURMODEL sea la clase, no la instancia.
Hay dos maneras de lograr esto. El primero es
var mongoose = require(''mongoose'');
var myStub = sinon.stub(mongoose.Model, METHODNAME);
Si consola log mongoose.Model verá los métodos disponibles para el modelo (notablemente esto no incluye la opción lte).
La otra forma (modelo específico) es
var myStub = sinon.stub(YOURMODEL.prototype.base.Model, ''METHODNAME'');
De nuevo, los mismos métodos están disponibles para stub.
EDITAR: algunos métodos, como guardar, se repiten de la siguiente manera:
var myStub = sinon.stub(mongoose.Model.prototype, METHODNAME);
var myStub = sinon.stub(YOURMODEL.prototype, METHODNAME);
save
no es un método en el modelo, es un método en el documento (instancia de un modelo). Establecido aquí en documentos de mangosta .
Construyendo documentos
Los documentos son instancias de nuestro modelo. Crearlos y guardarlos en la base de datos es fácil
Por lo tanto, siempre estará indefinido si está utilizando su modelo para simular un save()
Siguiendo con la respuesta de @Gon , usando sinon-mongoose & factory-girl con Account
como mi modelo:
No trabajará
var AccountMock = sinon.mock(Account)
AccountMock
.expects(''save'') // TypeError: Attempted to wrap undefined property save as function
.resolves(account)
Funcionará
var account = { email: ''[email protected]'', password: ''abc123'' }
Factory.define(account, Account)
Factory.build(''account'', account).then(accountDocument => {
account = accountDocument
var accountMock = sinon.mock(account)
accountMock
.expects(''save'')
.resolves(account)
// do your testing...
})