Chai Sinon,should.have.been旗帜未定义?

时间:2014-12-28 22:46:01

标签: javascript node.js mocha sinon chai

很多道歉的标题,我仍然在想一个更好的解释方法。

我在Chai调用should.have.been时遇到问题。 ,属性总是返回undefined。奇怪的是我正在做一个console.log(should.have.been),它打印完整的对象,但由于某种原因我无法访问标志。

example.js in test

var var BaseController = function (model, routesFn) {
    var router = require('express').Router();
    routesFn(router);

    return router;
};

test.js

var controller = require('../lib/controller.js')
,assert = require("assert")
,chai = require('chai')
,sinon = require('sinon')
,should = chai.should();


describe('baseController', function() {
  it('should have something..', function() {

    var routesFn = sinon.spy();
    controller(null, routesFn);

    routesFn.should.have.not.been.called;   //notice the 'not'.  
                                            //Should fail here, but called is undefined
    assert.equal(routesFn.called, true);

  });
});

所以,我能够通过使用assert.equa()来验证回调'routesFn',但由于某种原因,被调用的属性显示为undefined。我最初尝试使用chai创建一个应该被称为语法的测试,后来意识到即使我没有实现逻辑,我的测试也会通过。

当我执行对象的console.log时,我看到了这个

console.log(routesFn.should.have.not.been);


{ __flags:
   { ssfi: [Function: shouldGetter],
     object:
      { [Function: proxy]
       reset: [Function],
       invoke: [Function: invoke],
       named: [Function: named],
       ...
       called: true
    }
}

当我从'被叫'中取出控制台时,它会打印未定义的。显然我无法访问嵌套属性。

console.log(routesFn.should.have.not.been.called);  //expecting to print true

//prints
undefined

那么,我在初始设置中遗漏了什么吗?我想我需要在'should'变量初始化中添加其他内容,但在google上找不到任何内容。

1 个答案:

答案 0 :(得分:1)

柴本身并不支持你想要做的事情。

我认为你所谓的example.js应该是controller.js,应该是这样的:

module.exports = function (model, routesFn) {
    var router = require('express').Router();
    routesFn(router);

    return router;
};

否则,我无法看到您的代码如何工作。使用上面的模块,我需要更改为test.js文件的唯一方法是在您已经拥有的必需来电之后以及调用chai.should()后添加此内容:

var sinonChai = require('sinon-chai');
chai.use(sinonChai);

sinon-chai增加了对should.have.not.been.called的支持。有了这个,您的测试就会失败。