【发布时间】:2020-05-07 11:15:03
【问题描述】:
在我的一个单元测试中,我需要监视一个函数,该函数被另一个带有Sinon 库的函数用作构造函数。根据他们的文档
...
sinon.spy(object, "method")创建一个封装现有函数 object.method 的 spy。间谍的行为将与原始方法完全相同(包括用作构造函数时)... 但是到目前为止,即使尝试监视在测试函数中调用的构造函数,我也未能使其工作,更不用说由另一个函数调用了。
单元测试:
it('constructor was called.', () => {
const Foo = require('../app/foo');
const fooModule = module.children.find(m => m.id.includes('foo.js'));
const fooSpy = sinon.spy(fooModule, 'exports');
const f = new Foo(5);
expect(fooSpy).calledOnce;
});
要实例化的函数:
const Foo = function(param) {
console.log('Foo called with: ' + param);
};
Foo.prototype.bar = function(x) {
console.log(`Foo.prototype.bar() called with x: ` + x);
};
module.exports = Foo;
当我使用调试器时,我可以看到const fooSpy = sinon.spy(fooModule, 'exports'); 处的函数被间谍替换(已添加所有sinon 属性,如calledOnce 等等......)但是当在new Foo(5); 上时,它会出现Foo 是一个非间谍对象。
我认为这可能是一个范围界定或参考错误,但我似乎无法找到除了 module.children 之外还有什么地方可以定义 Foo。它不在global 上,也不在window 上,因为它在node 上运行。
目前测试当然失败了:
Foo called with: 5
AssertionError: expected exports to have been called exactly once, but it was called 0 times
at Context.it (test/fooTest.js:18:23)
提前感谢您的帮助!
【问题讨论】:
-
我认为你做不到。需要/导入的模块与您正在测试的代码处于不同的级别。当您的测试代码运行时,这些模块已经加载。您对
module.exports的访问权限与对当前执行上下文中引用的对象(例如Foo、f的实例)的访问权限不同。
标签: javascript node.js unit-testing sinon