Jasmine-node - 在其他函数内部调用的构造函数上创建间谍

Grz*_*nik 4 javascript spy node.js jasmine-node

我是 jasmine 的新手,我需要在这个框架中为 node.js 应用程序编写一些单元测试。我有一些问题,其中之一如下所述:

var sampleFunction = function(){
    var loader = new Loader(params);
    // rest of logic here
}
Run Code Online (Sandbox Code Playgroud)

我想为sampleFunction. 为此,我需要在Loader构造函数上创建 spy并检查此构造函数作为参数获取的内容以及它返回的对象类型。

任何想法如何做到这一点?我尝试创建 spy on ,Loader.prototype.constructor但这不是解决此问题的方法。

Chr*_*ger 5

好的,所以通常在客户端 JavaScript 中你会像这样使用 window 对象 jasmine.spyOn(window, 'Loader')

然而,在 node 中,没有 window 对象,尽管声称相反, global 不是替代品(除非您在全局范围内运行的 REPL 中)。

function MyConstructor () {}
console.log(global.MyConstructor); --> undefined
console.log(this.MyConstructor); --> undefined
Run Code Online (Sandbox Code Playgroud)

因此,在节点中,您需要将构造函数附加到一个对象上。所以就做这样的事情

var Helpers = {
   Loader: Loader
};

var constSpy = jasmine.spyOn(Helpers, 'Loader').andCallThrough();

sampleFunction();

expect(constSpy).toHaveBeenCalled();
Run Code Online (Sandbox Code Playgroud)

andCallThrough,如果你想你的构造函数做一些事情(与构造往往你做的)调用才是必需的。

这有点 hacky,但它有效并且似乎是通过 jasmine 在 node.js 中的实现来实现这一点的唯一方法。

  • 较新版本的 jasmine:`.and.callThrough();` 而不是 `andCallThrough()` (2认同)