2016-09-19 3 views
0

Я все еще изучаю веревки, когда дело доходит до модульного тестирования с угловым. У меня есть угловая служба, которую я использую для создания уведомлений HTML5. Код похож на следующее:

(function() { 
    'use strict'; 

    angular 
    .module('blah') 
    .factory('OffPageNotification', offPageNotificationFactory); 

    function offPageNotificationFactory($window) { 
    //Request permission for HTML5 notifications as soon as we can 
    if($window.Notification && $window.Notification.permission !== 'denied')  { 
     $window.Notification.requestPermission(function (status) { }); 
    } 

    function OffPageNotification() { 
     var self = Object.create(OffPageNotification.prototype); 
     self.visibleNotification = null; 
     return self; 
    } 


OffPageNotification.prototype.startNotification = function (options) { 
     var self = this; 
     self.options = options; 
     if(self.options.showHtml5Notification && (!self.options.onlyShowIfPageIsHidden || $window.document.hidden)) { 
    if($window.Notification && $window.Notification.permission !== 'denied')  { 
      self.visibleNotification = new $window.Notification('Notification',  { 
       body: self.options.notificationText, 
       icon: self.options.notificationIcon 
      }); 
     } 
     } 
    }; 

    . 
    . 
    . 
    return new OffPageNotification(); 
    } 
})(); 

Я пытающегося писать тесты для этого, но я не уверен, как издеваются $ window.Notification, поэтому он может быть использован и как конструктор ...

self.visibleNotification = new $window.Notification(....) 

, а также содержат свойства

if($window.Notification && $window.Notification.permission !== 'denied') 

и методы ....

$window.Notification.requestPermission(

пример того, что я попытался это:

 describe('startNotification', function() { 

    beforeEach(function() { 
     var mockNotification = function (title, options) { 
     this.title = title; 
     this.options = options; 
     this.requestPermission = sinon.stub(); 
     }; 

     mockNotification.prototype.permission = 'granted'; 

     mockWindow = { 
     Notification: new mockNotification('blah', {}), 
     document: {hidden: true} 
     }; 

     inject(function (_OffPageNotification_) { 
     OffPageNotification = _OffPageNotification_; 
     }); 
    }); 

    it('should display a html5 notification if the relevant value is true in the options, and permission has been granted', function(){ 
     var options = { 
     showHtml5Notification: true, 
     onlyShowIfPageIsHidden: true 
     }; 
     OffPageNotification.startNotification(options); 
    }); 
    }); 

Я получаю сообщение об ошибке сказав «$ window.Notification не конструктор» с этой установкой, и я понимаю, почему (я передаю в конкретизированной версии mockNotification). Но если я устанавливаю mockWindow.Notification = mockNotification, тогда я получаю сообщение об ошибке при вызове requestPermission, так как это не определено.

Любая помощь приветствуется

ответ

1

Notification должен быть конструктор. И он должен иметь статические properties и methods.

Всех соответствующих свойств mockNotification является свойством экземпляра, в то время как они должны быть статичными:

function MockNotification() {} 

MockNotification.title = title; 
MockNotification.options = options; 
MockNotification.requestPermission = sinon.stub(); 

    mockWindow = { 
    Notification: MockNotification, 
    document: {hidden: true} 
    }; 
+0

Спасибо, получил это работает с вашей помощью – Neil

Смежные вопросы