我在让 Sinon 的 stub 为我正常工作时遇到问题。当我在 list 上 stub retro 并且测试运行时,app.get('/retro', retro.list) 正在执行原始函数 retro.list 而不是 stub 。由于发生这种情况,测试失败,因为 stub 的 callCount 为 0。

我更熟悉coffeescript,我也用同样的方式处理过事情。有什么我不了解 Javascript 的范围,或者 require('../routes/retro') 是如何工作的,或者 retroapp.js 中的 test.js 不一样。

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

测试.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();
      })
  })
})

应用程序.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;

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

module.exports = retro;

最佳答案

在要求/创建 app 之前,您可能需要创建 stub 。

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);

这允许 retro.list 在传递到路由之前被更新:
app.get('/retro', retro.list);

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

关于javascript - 调用原始函数而不是 stub ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18006010/

10-12 00:07