调用原始函数而不是存根

kma*_*ana 4 javascript stub mocha.js express sinon

我有一个问题让Sinon的存根正常工作.当我存根listretro和试运行,app.get('/retro', retro.list)正在执行原有的功能retro.list,而不是存根.由于这种情况发生,测试失败,因为存根callCount为0.

我对coffeescript更熟悉,而且我用同样的方式抄袭了东西.有什么我不了解Javascript的范围,或者require('../routes/retro')工作方式,或者retro是不是app.jstest.js.

非常感谢下面的帮助和代码.

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();
      })
  })
})
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

retro.js:

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

module.exports = retro;
Run Code Online (Sandbox Code Playgroud)

Jon*_*ski 9

在需要/创建存根之前,您可能需要创建存根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);
Run Code Online (Sandbox Code Playgroud)

这允许retro.list在传递到路线之前进行更新:

app.get('/retro', retro.list);
Run Code Online (Sandbox Code Playgroud)

问题可能是因为retro.list不是通过引用传递(指针),而是通过值传递(复制)的引用.因此,虽然sinon.stub()正在改变retro.list,但它不会影响'/retro'路线已经拥有的副本.