Triggers 我有一个angularjs服务函数来测试$(window).trigger是否使用参数调用(使用jasmine)

Triggers 我有一个angularjs服务函数来测试$(window).trigger是否使用参数调用(使用jasmine),triggers,window,mocking,angularjs,jasmine,Triggers,Window,Mocking,Angularjs,Jasmine,我是jasmine的新手,使用angularjs作为框架。 如何测试$(窗口).trigger“haveBeenCalledWith”: 要测试的代码(它是angularjs服务中的一个函数): 我将isConnected设置为false,我想测试$(窗口)。使用上述参数调用触发器,当要测试的代码依赖于其他库/框架时,这总是一个问题。因此,在您的例子中,使用$(window)作为全局事件总线是使代码难以测试的根。有一些解决方案: 让$()返回一个模拟,您可以在其中监视触发器方法。这将使测试代码更

我是jasmine的新手,使用angularjs作为框架。 如何测试
$(窗口).trigger
“haveBeenCalledWith”:

要测试的代码(它是angularjs服务中的一个函数):


我将
isConnected
设置为false,我想测试
$(窗口)。使用上述参数调用触发器
,当要测试的代码依赖于其他库/框架时,这总是一个问题。因此,在您的例子中,使用$(window)作为全局事件总线是使代码难以测试的根。有一些解决方案:

$()
返回一个模拟,您可以在其中监视
触发器
方法。这将使测试代码更加冗长,但您可以保留实际代码:

var trigger = jasmine.createSpy();
spyOn(window, '$').andReturn({trigger: trigger});

yourLib.start('url', callback);

expect(trigger).toHaveBeenCalledWith(events.onShowModalDialog, {
   title: "Worklist Server Error",
   body: "Can not establish connection to Worklist server",
   type: generalStatusEnum.ERROR
 });
在您的示例中,这很容易,因为您只使用了一次
$
,但是如果考虑在函数中使用不同的jquery,那么测试函数会变得非常困难或不可能

更好的方法是将事件总线传递到函数或类的构造函数中。例如,您的启动函数可以如下所示:

start: function (serverUrl, callbackFunc, eventBus) {
  commManager.initAsync(serverUrl, function (isConnected) {
    if (isConnected) {
      var msgHeader = new protocolMessageHeader(userSessionGuid, messageCommandName.START_WL_SESSION + "_RQ");
      var dataSet = { $type: 10, UserSessionGuid: userSessionGuid, WLSessionGuid: wlSessionGuid };
      commManager.sendMessage(new protocolMessage(msgHeader, dataSet), function (data) {                              
        if (callbackFunc) {
          callbackFunc(data);
        }
      });
    } else {                          
      eventBus.trigger(events.onShowModalDialog, {
        title: "Worklist Server Error",
        body: "Can not establish connection to Worklist server",
        type: generalStatusEnum.ERROR
      });
    }
  });
}
测试结果如下所示:

var trigger = jasmine.createSpy();

yourLib.start('url', callback, trigger);

expect(trigger).toHaveBeenCalledWith(events.onShowModalDialog, {
   title: "Worklist Server Error",
   body: "Can not establish connection to Worklist server",
   type: generalStatusEnum.ERROR
 });
编辑 只需意识到您的所有代码都包装在回调中,因此您还可以监视
commManager.initAsync
,并调用回调:

spyOn(commManager, 'initAsync');

var callback = commManager.initAsync.mostRecentCall.args[1];
callback();
spyOn(commManager, 'initAsync');

var callback = commManager.initAsync.mostRecentCall.args[1];
callback();