unit nodejs node node.js mongoose sinon

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