使用 Jasmine 在不同的 JavaScript 文件中捕获传递给函数的参数

tou*_*rab 6 javascript jasmine

我有一个 JavaScript 文件main_one.js,它需要另一个 JavaScript 文件helper.js

helper.js

warp = {
  postThisEvent: function(a) {
    // some operation on a
  }
};
Run Code Online (Sandbox Code Playgroud)

main_one.js

var Helper = require('path/helper.js');
// some steps
Helper.warp.postThisEvent(event);
Run Code Online (Sandbox Code Playgroud)

我想event使用 Jasmine进行捕捉。如何创建我的间谍对象捕获eventpostThisEvent()

try*_*lly 13

在 Jasmine 测试中 require Helper,然后以这种方式进行 spy:

spyOn(Helper.warp, "postThisEvent").and.callThrough();
Run Code Online (Sandbox Code Playgroud)

这将用间谍功能替换postThisEvent对象Helper.warp。当它被调用时,间谍将注册该调用,然后按照callThrough().

然后你可以期望postThisEvent()以这种方式使用预期的对象调用它:

expect(Helper.warp.postThisEvent).toHaveBeenCalledWith(jasmine.objectContaining({
    someProperty: "someValue"
}));
Run Code Online (Sandbox Code Playgroud)

jasmine.objectContaining() 是一个助手,它只会测试预期属性是否存在于被测对象的多个属性中。

您还可以直接检查复杂对象:

expect(Helper.warp.postThisEvent.calls.mostRecent().args[0].someProperty).toBe("someValue");
Run Code Online (Sandbox Code Playgroud)

请注意,这样的间谍在postThisEvent()保存到一个变量时可能不起作用,然后像这样调用:

var postThisEvent = Helper.warp.postThisEvent;
function triggering() {
    postThisEvent({ someProperty: "someValue" })
}
// now a spy is created and then triggering() is called
Run Code Online (Sandbox Code Playgroud)

在这种情况下,在监视时无法访问对原始方法的引用。在这种情况下,无法在 Javascript 中拦截函数/方法。