0

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

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

start: function (serverUrl, callbackFunc) {
                  // initialize communication manager and when ready start the worklist server
                  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 {                          
                          **$(window).trigger(events.onShowModalDialog, {
                              title: "Worklist Server Error",
                              body: "Can not establish connection to Worklist server",
                              type: generalStatusEnum.ERROR
                          });**
                      }
                  });
              }

我做isConnected了假,我想测试$(window).trigger用上述参数调用的

4

1 回答 1

0

当您要测试的代码依赖于其他库/框架时,它总是一个问题。因此,在您的情况下,使用 $(window) 作为全局事件总线是它使代码难以测试的根源。有一些解决方案:

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

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();
于 2013-01-02T19:27:38.117 回答