res node handling error end desde create code cero node.js sinon

node.js - node - Error de Sinon Intento de ajustar la función que ya está ajustada



node js error handling (7)

Debe restaurar la función getObj en after() , intente de la siguiente manera.

describe(''App Functions'', function(){ var mockObj; before(function () { mockObj = sinon.stub(testApp, ''getObj'', () => { console.log(''this is sinon test 1111''); }); }); after(function () { testApp.getObj.restore(); // Unwraps the spy }); it(''get results'',function(done) { testApp.getObj(); }); }); describe(''App Errors'', function(){ var mockObj; before(function () { mockObj = sinon.stub(testApp, ''getObj'', () => { console.log(''this is sinon test 1111''); }); }); after( function () { testApp.getObj.restore(); // Unwraps the spy }); it(''throws errors'',function(done) { testApp.getObj(); }); });

Aunque hay una misma pregunta aquí, pero no pude encontrar la respuesta a mi problema, así que aquí va mi pregunta:

Estoy probando mi aplicación node js usando mocha y chai. Estoy usando sinion para ajustar mi función.

describe(''App Functions'', function(){ let mockObj = sinon.stub(testApp, ''getObj'', (dbUrl) => { //some stuff }); it(''get results'',function(done) { testApp.someFun }); } describe(''App Errors'', function(){ let mockObj = sinon.stub(testApp, ''getObj'', (dbUrl) => { //some stuff }); it(''throws errors'',function(done) { testApp.someFun }); }

Cuando intento ejecutar esta prueba me da error

Attempted to wrap getDbObj which is already wrapped

También intenté poner

beforeEach(function () { sandbox = sinon.sandbox.create(); }); afterEach(function () { sandbox.restore(); });

en cada descripción, pero aún me da el mismo error.


Este error se debe a que no se restaura la función de código auxiliar correctamente. Use sandbox y luego cree el trozo usando sandbox. Después del conjunto de pruebas, restaure el entorno limitado.

before(() => { sandbox = sinon.sandbox.create(); mockObj = sandbox.stub(testApp, ''getObj'', fake_function) }); after(() => { sandbox.restore(); });


Incluso con sandbox podría darte el error. Especialmente cuando las pruebas se ejecutan en paralelo para las clases de ES6.

const sb = sandbox.create(); before(() => { sb.stub(MyObj.prototype, ''myFunc'').callsFake(() => { return ''whatever''; }); }); after(() => { sb.restore(); });

esto podría arrojar el mismo error si otra prueba está tratando de eliminar myFunc del prototipo. Pude arreglar eso, pero no estoy orgulloso de eso ...

const sb = sandbox.create(); before(() => { MyObj.prototype.myFunc = sb.stub().callsFake(() => { return ''whatever''; }); }); after(() => { sb.restore(); });


Me encontré con esto con espías. Este comportamiento hace que Sinon sea bastante inflexible para trabajar. Creé una función auxiliar que intenta eliminar cualquier espía existente antes de configurar uno nuevo. De esa manera no tengo que preocuparme por ningún estado antes / después. Un enfoque similar también podría funcionar para los talones.

import sinon, { SinonSpy } from ''sinon''; /** * When you set a spy on a method that already had one set in a previous test, * sinon throws an "Attempted to wrap [function] which is already wrapped" error * rather than replacing the existing spy. This helper function does exactly that. * * @param {object} obj * @param {string} method */ export const spy = function spy<T>(obj: T, method: keyof T): SinonSpy { // try to remove any existing spy in case it exists try { // @ts-ignore obj[method].restore(); } catch (e) { // noop } return sinon.spy(obj, method); };


Para los casos en que necesite restaurar todos los métodos de un objeto, puede usar el sinon.restore(obj) .

Ejemplo:

before(() => { userRepositoryMock = sinon.stub(userRepository); }); after(() => { sinon.restore(userRepository); });


Se recomienda inicializar los apéndices en ''beforeEach'' y restaurarlos en ''afterEach''. Pero en caso de que te sientas aventurero, lo siguiente también funciona.

describe(''App Functions'', function(){ let mockObj = sinon.stub(testApp, ''getObj'', (dbUrl) => { //some stuff }); it(''get results'',function(done) { testApp.someFun mockObj .restore(); }); } describe(''App Errors'', function(){ let mockObj = sinon.stub(testApp, ''getObj'', (dbUrl) => { //some stuff }); it(''throws errors'',function(done) { testApp.someFun mockObj .restore(); }); }


También estaba golpeando esto usando los ganchos before () y after () de Mocha. También estaba usando la restauración () como se menciona en todas partes. El archivo de prueba único funcionó bien, varios no. Finalmente encontré sobre Mocha root-level-hooks : no tenía mi before () y after () dentro de mi propio describe (). Por lo tanto, encuentra todos los archivos con before () en el nivel raíz y los ejecuta antes de comenzar cualquier prueba.

Así que asegúrese de tener un patrón similar:

describe(''my own describe'', () => { before(() => { // setup stub code here sinon.stub(myObj, ''myFunc'').callsFake(() => { return ''bla''; }); }); after(() => { myObj.myFunc.restore(); }); it(''Do some testing now'', () => { expect(myObj.myFunc()).to.be.equal(''bla''); }); });