0

私はジャスミンが初めてで、フレームワークとして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 に答える