La function original se llama en lugar de stub

Tengo problemas para que el código de Sinon funcione correctamente para mí. Cuando termino la list en retro y las ejecuciones de testing, app.get('/retro', retro.list) está ejecutando la function original retro.list lugar del stub. Como esto sucede, la testing falla porque el callCount del callCount es 0.

Estoy más familiarizado con coffeescript y he rebatido las cosas de la misma manera. ¿Hay algo que no entiendo sobre el scope de JavaScript, o cómo funciona el require('../routes/retro') , o es retro no es lo mismo en app.js y test.js

Muchas gracias por la ayuda y el código a continuación.

test.js:

 var request = require('supertest') , retro = require('../routes/retro') , app = require('../app') , sinon = require('sinon'); require('should'); describe('GET /retro', function() { // less involved, but maybe stupid to test it('should call retro.list', function(done) { var stub = sinon.stub(retro, 'list'); request(app) .get('/retro') .end(function(err, res){ stub.callCount.should.equal(1); if (err) return done(err); done(); }) }) }) 

app.js:

 var express = require('express') , config = require('./config') , routes = require('./routes') , retro = require('./routes/retro'); var app = express(); config(app); app.get('/', routes.index); app.get('/retro', retro.list); module.exports = app; 

retro.js:

 var retro = { list: function(req, res){ console.log('actual called'); res.send("respond with a resource"); } } module.exports = retro; 

2 Solutions collect form web for “La function original se llama en lugar de stub”

Es probable que necesite crear sus stubs antes de requerir / crear la app .

 var request = require('supertest') , sinon = require('sinon') , retro = require('../routes/retro'); var stubRetroList = sinon.stub(retro, 'list'); var app = require('../app'); // ... stubRetroList.callCount.should.equal(1); 

Esto permite que retro.list se actualice antes de pasar a la ruta:

 app.get('/retro', retro.list); 

El problema es probablemente porque retro.list no se pasa por reference (puntero), sino que es más bien una reference retro.list por valor (copyda). Entonces, aunque sinon.stub() está alterando retro.list , no afectaría la copy que ya tenía la ruta '/retro' .

Enfrenté el mismo problema y la respuesta aceptada (aunque verdadera) no fue de ayuda. sinon apaga para que funcione el sinon sinónidal. El sinon troquelado no se puede usar en el mismo module. En otras palabras, el punteo de un punto extremo del module solo ressaveá el punto extremo del module y no el uso interno de la function a la que se hace reference en module.exports .

Explicado a través de un ejemplo:

module.js

 const express = require('express') const router = express.Router() router.get('/', function (req, res) { res.status(200).json(list()) }) function list() { return ['something'] } module.exports = { router: router, list: list } 

module.spec.js

 // This stub will not work sinon.stub(module, 'list').callsFake(() => ['something else']) 

Para hacerlo funcionar, tiene separado lo que desea insert en su propio module y usarlo de esa manera:

seb_module.js

 function list() { return ['something'] } module.exports = { list: list } 

Ahora sub_module.list() puede anularse.

(OP define un método en su lugar por lo que no es un problema para él)

Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.