首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用原始函数而不是存根。

调用原始函数而不是存根。
EN

Stack Overflow用户
提问于 2013-08-01 22:53:08
回答 2查看 3K关注 0票数 4

我有一个问题,让西农的存根正确地为我工作。当我在list上存根retro并运行测试时,app.get('/retro', retro.list)正在执行原始函数retro.list而不是存根。由于这种情况发生,所以测试失败,因为存根的callCount是0。

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

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

test.js:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
var retro = {
  list: function(req, res){
    console.log('actual called');
    res.send("respond with a resource");
  }
}

module.exports = retro;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-01 23:16:56

您可能需要在要求/创建app之前创建存根。

代码语言:javascript
复制
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

代码语言:javascript
复制
app.get('/retro', retro.list);

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

票数 9
EN

Stack Overflow用户

发布于 2017-12-23 01:46:15

我也面临着同样的问题,被接受的答案(虽然是真的)对我毫无帮助。结果表明,为了使sinon存根工作,不能在同一个模块中使用存根方法。换句话说,阻塞模块端点只会存根模块端点,而不是module.exports引用的函数的内部使用情况。

通过一个例子解释:

module.js

代码语言:javascript
复制
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

代码语言:javascript
复制
// This stub will not work
sinon.stub(module, 'list').callsFake(() => ['something else'])

为了使其工作,您可以将想要存根的内容分离到它自己的模块中,并以这种方式使用它:

sub_module.js

代码语言:javascript
复制
function list() {
    return ['something']
}

module.exports = {
    list: list
}

现在,sub_module.list()可以被短截。

(OP定义了一个适当的方法,所以这对他来说不是问题)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18006010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档