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

时间:2016-05-09 08:09:50

标签: javascript jasmine

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

helper.js

warp = {
  postThisEvent: function(a) {
    // some operation on a
  }
};

main_one.js

var Helper = require('path/helper.js');
// some steps
Helper.warp.postThisEvent(event);

我想使用Jasmine捕获event。如何创建我的间谍对象以在event中捕获postThisEvent()

1 个答案:

答案 0 :(得分:2)

在Jasmine测试中需要Helper,然后以这种方式窥探:

spyOn(Helper.warp, "postThisEvent").and.callThrough();

这将使用间谍功能替换对象postThisEvent上的Helper.warp。当它被调用时,间谍将注册呼叫而不是调用原始方法,因为这是callThrough()指示的。

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

expect(Helper.warp.postThisEvent).toHaveBeenCalledWith(jasmine.objectContaining({
    someProperty: "someValue"
}));

jasmine.objectContaining()是一个帮助程序,它只测试在测试对象的多个属性中是否存在expecte属性。

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

expect(Helper.warp.postThisEvent.calls.mostRecent().args[0].someProperty).toBe("someValue");

请注意,当postThisEvent()保存到变量时,这样的间谍可能无法工作,然后像这样调用:

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

在这种情况下,在进行间谍活动时无法达到对原始方法的引用。在Javascript中,在这种情况下无法拦截函数/方法。