所以这个问题实际上是二合一的。
Firstly,“如何测试方法是否被调用”:
我在示例中为此列出了代码,但基本上,使用 sinon.js,您只需将该方法包装在“spy”中,这允许您编写一个期望调用该间谍的测试。
Secondly,“如何测试私有函数(未作为模块的一部分导出的函数)是否已被调用”:
基本上,你不知道。在测试环境中而不是在生产环境中导出这些函数是可能的,但这对我来说似乎有点太老套了。
我得出的结论是,当调用另一个模块时,您应该只是打破 TDD 周期而不是对此进行测试,因为它可能只是少量代码,并且该模块已经自己进行了测试。
如果您正在调用模块内声明的私有函数并想要测试它,您应该编写一个更广泛的测试来测试调用该函数的结果,而不是测试该函数是否正在被调用或实际是什么发生在函数内部。
这是一个非常简单的例子:
foo.js
var _ = require('lodash');
var Foo = module.exports = function (config) {
this.config = _.merge({
role: 'user',
x: '123',
y: '321'
},
config);
this.config.role = validateRole(this.config.role);
};
var validateRole = function (role) {
var roles = [
'user', 'editor', 'admin'
];
if (_.contains(roles, role)) {
return role;
} else {
return 'user'
}
};
fooSpec.js
var chai = require('chai');
var expect = chai.expect;
var Foo = require('../lib/foo');
describe('Foo', function () {
it('should set role to \'user\' if role is not valid', function () {
var foo = new Foo({role: 'invalid'});
expect(foo.config.role).to.equal('user');
});
};