objetos hacer es6 definir constructores como clases javascript unit-testing constructor mocking sinon

hacer - Javascript: Constructor burlón usando Sinon



javascript prototype constructor (7)

Me estoy tirando de los pelos tratando de descubrir cómo burlarme de un constructor usando sinon. Tengo una función que creará múltiples widgets llamando a un constructor que acepta algunos argumentos. Quiero verificar que al constructor se le llame el número correcto de veces con los parámetros correctos, pero no quiero construir los widgets. Los siguientes enlaces aparentemente explican una forma directa de burlarse del constructor, sin embargo, no funciona para mí:

Espiando a un constructor usando Jasmine

http://tinnedfruit.com/2011/03/25/testing-backbone-apps-with-jasmine-sinon-2.html

Cuando hago la siguiente llamada para stub el constructor:

sinon.stub(window, "MyWidget");

Obtuve el siguiente error:

Uncaught TypeError: Attempted to wrap undefined property MyWidget as function

Al depurar en Chrome, veo que MyWidget aparece en la sección Local de las Variables de alcance, sin embargo, no hay propiedad de MyWidget fuera de la ventana.

Cualquier ayuda sería muy apreciada.


Acabo de encontrar esto en la documentation.

Si desea crear un objeto de código auxiliar de MyConstructor, pero no desea que se invoque el constructor, use esta función de utilidad.

var stub = sinon.createStubInstance (MyConstructor)


Desde el sitio oficial de sinonjs:

Reemplaza object.method con una función de código auxiliar. La función original se puede restaurar llamando a object.method.restore (); (o stub.restore ();). Se lanza una excepción si la propiedad ya no es una función, para ayudar a evitar errores tipográficos cuando se usan métodos de anotación.

esto simplemente indica que la función para la cual desea crear el stub debe ser miembro del objeto objeto.

Para aclarar las cosas; llama

sinon.stub(window, "MyWidget");

La función MyWidget debe estar dentro del alcance global (ya que pasa la ventana como parámetro). Sin embargo, como ya ha dicho, esta función está en un ámbito local (probablemente definido dentro de un objeto literal o un espacio de nombres).

En JavaScript, todos pueden tener acceso al alcance global, pero no al revés.

Compruebe dónde declara la función MyWidget y pase el objeto contenedor como primer parámetro a sinon.stub ()


Me encontré con este error escribiendo erróneamente sinon.stub.throws(expectedErr) lugar de sinon.stub().throws(expectedErr) . He cometido errores similares antes y no he encontrado este mensaje en particular antes, así que me tiré.


Necesitaba una solución para esto porque mi código estaba llamando al nuevo operador. Quería burlarme del objeto creado por la nueva llamada.

var MockExample = sinon.stub(); MockExample.prototype.test = sinon.stub().returns("42"); var example = new MockExample(); console.log("example: " + example.test()); // outputs 42

Luego utilicé rewire para inyectarlo en el código que estaba probando

rewiredModule = rewire(''/path/to/module.js''); rewiredModule.__set__("Example", example);


Pude hacer que StubModule funcione después de algunos ajustes, sobre todo al pasar async: false como parte de la configuración cuando se requiere en el módulo de StubModule .

Felicitaciones al Sr. Davis por juntar eso


Utilicé Mockery para simular un constructor / función sin ningún problema.

var mockery = require(''mockery''); var sinon = require(''sinon''); mockery.enable({ useCleanCache: true, warnOnReplace: false, warnOnUnregistered: false }); exports.Client = function() {/* Client constructor Mock */}; var ClientSpy = sinon.spy(exports, ''Client''); mockery.registerMock(''Client'', ClientSpy); var Factory = require(''Factory''); // this module requires the Client module

Debería poder aplicar un Sinon Spy tal como lo hace el ejemplo anterior.

¡Asegúrate de deshabilitar o reiniciar Mockery después de la (s) prueba (s)!


Utilizando Sinon 4.4.2, pude simular un método de instancia como este:

sinon.stub(MyClass.prototype, myMethod).resolves(tesObj)

Necesitaba un simulacro para una línea que parecía algo así:

let someData = await new MyClass(token).myMethod(arg1, arg2)

Una solución similar que se proporciona aquí: aplastar un método de clase con Sinon.js