2013-04-14 46 views
0

我剛剛寫了這個服務,提醒他們在關閉窗口時的未保存數據的用戶:測試一個服務反應到DOM事件

module.factory('autosaver', 
     ['$rootScope', '$window', 'editor', 'doc', 'saveInterval', '$timeout', 
     function ($rootScope, $window, editor, doc, saveInterval, $timeout) { 

     var scope = $rootScope.$new(true); 
     scope.doc = doc; 
     scope.confirmOnLeave = function(e) { 
     var msg = "You have unsaved data."; 

     // For IE and Firefox 
     e = e || window.event; 
     if (e) {e.returnValue = msg;} 

     // For Chrome and Safari 
     return msg; 
    }; 
    scope.$watch('doc.dirty', function (newValue, oldValue) { 
     if(newValue !== oldValue) { 
      newValue ? $window.addEventListener('beforeunload', scope.confirmOnLeave) : $window.removeEventListener('beforeunload', scope.confirmOnLeave); 
     } 
    }); 

    return scope; 
}]); 

現在我想寫的規範。我無法弄清楚如何模擬beforeunload事件並且偵聽這個調用。 我試過這段代碼:

it('should listen to beforeunload event', inject(function ($window, autosaver) { 
     autosaver.confirmOnLeave = jasmine.createSpy('confirmOnLeave'); 

     var evt = document.createEvent("beforeunloadEvents"); 
     evt.initMouseEvent("beforeunload", true, true, $window, 
      0, 0, 0, 0, 0, false, false, false, false, 0, null); 

     $window.dispatchEvent(evt); 
    })); 

但我得到這個錯誤:

NotSupportedError: NotSupportedError: DOM Exception 9 
    Error: The implementation did not support the requested type of object or operation. 

感謝您的幫助。

回答

1

而不是直接與DOM玩模擬$window.addEventListener並立即調用回調函數。

jasmine.spyOn($window, 'addEventListener'); 

打電話給你工作,那麼觸發事件:

var msg = $window.addEventListener.mostRecentCall. args[1]({}) 
expect(msg).toBeEqual("You have unsaved data.") 
+0

很好的方式來實現,謝謝。現在我很掙扎,因爲現在在我的手錶功能中,新的價值總是等於舊價值。只有在測試時發生,確定在真實應用程序中。 我已經發布了一個plnkr來說明我的問題:http://plnkr.co/edit/BezAEM?p=preview –

+0

強制$摘要 – jujule

相關問題