2015-03-13 2 views
0

У меня есть код, который представляет собой вилку ng-wrap, которая была вдохновлена ​​от this article. В принципе, он создает угловую услугу для глобальных переменных, внедряемых сторонними библиотеками, это подтверждение с помощью концепции angularjs инъекции зависимости. Но я борюсь за то, как проверить, была ли фактически преобразована сторонняя переменная в угловое обслуживание.Как проверить жасмин, если на самом деле создано угловое обслуживание?

вот код:

(function() { 
    'use strict'; 

    angular 
    .module('blocks.wrapper', []); 
})(); 


/* jshint ignore:start, -W101 */ 
// Inspired from http://www.bennadel.com/blog/2720-creating-and-extending-a-lodash-underscore-service-in-angularjs.htm 
// Fork from https://github.com/bahmutov/ng-wrap 
/* jshint ignore:end, +W101 */ 
(function() { 
    'use strict'; 

    angular 
    .module('blocks.wrapper') 
    .provider('ngWrap', ngWrapProvider); 

    ngWrapProvider.$inject = ['$provide']; 
    /* @ngInject */ 
    function ngWrapProvider($provide) { 
    /* jshint validthis:true */ 
    this.wrapper = wrapper; 

    this.$get = function() { 
     return {'wrapper': wrapper}; 
    }; 

    /////////////////////////////////////////////////////////////////////////////////////////////// 
    //////////////////////////////////////// IMPLEMENTATION /////////////////////////////////////// 
    /////////////////////////////////////////////////////////////////////////////////////////////// 

    function wrapper(name, leaveGlobal) { 
     $provide.provider(name, function() { 
     if (typeof window[name] === 'undefined') { 
      throw new Error('Cannot find window.' + name); 
     } 

     var thing = window[name]; 
     if (!leaveGlobal) { 
      delete window[name]; 
     } 

     this.$get = function() { 
      return thing; 
     }; 
     }); 
    } 
    } 
})(); 

Я вот мой тест спецификации до сих пор:

'use strict'; 

/* jshint -W117, -W030 */ 
describe('blocks.wrapper', function() { 
    var ngWrapProvider; 
    var ngWrap; 
    var mocks = { 
    windowProperty: { 
     testProperty: 'testValue' 
    } 
    }; 

    beforeEach(module('blocks.wrapper', function (_ngWrapProvider_) { 
    ngWrapProvider = _ngWrapProvider_; 
    })); 

    beforeEach(inject(function (_ngWrap_) { 
    ngWrap = _ngWrap_; 
    })); 

    describe('ngWrapProvider', function() { 
    it('should successfuly be defined', inject(function() { 
     expect(ngWrapProvider).toBeDefined(); 
    })); 

    it('should have a wrapper method', function() { 
     expect(ngWrapProvider.wrapper).toBeDefined(); 
    }); 
    }); 

    describe('ngWrap', function() { 
    it('should successfuly be defined', function() { 
     expect(ngWrap).toBeDefined(); 
    }); 

    it('should have a wrapper method', function() { 
     expect(ngWrap.wrapper).toBeDefined(); 
    }); 
    }); 

    it('should have ngWrapProvider.wrapper & ngWrap.wrapper point to the same function', function() { 
    expect(ngWrapProvider.wrapper).toEqual(ngWrap.wrapper); 
    }); 

    describe('wrapper method', function() { 
    it('should throw an error when window.property is undefined', function() { 
     expect(function() { ngWrapProvider.wrapper('_'); }).toThrow(); 
     expect(function() { ngWrap.wrapper('_'); }).toThrow(); 
    }); 
    }); 
}); 

Я относительно новым для тестирования, так что я, вероятно, делать это все неправильно. И хотя, да, все тестовые спецификации выше, но я изо всех сил пытаюсь проверить, что window.property был фактически преобразован в угловое обслуживание.

Вот мои попытки до сих пор:

describe('wrapper method', function() { 
    ... 
    it('should convert window.property to an angular service', inject(function($injector) { 
    window._ = mocks.windowProperty; 
    ngWrapProvider.wrapper('_'); 
    $injector.invoke(ngWrapProvider); 
    expect(angular.injector().has('_')).toBeTruthy(); 
    })); 
}); 

выше дает ошибку: Error: [ng:areq] Argument 'fn' is not a function, got ngWrapProvider

при попытке удалить строку с $ инжектором полностью, то expect(angular.injector().has('_')).toBeTruthy(); всегда возвращает ложь.

У меня есть идея всего $ инжекторной вещь от this post

ответ

0

Так вот как я решить мою проблему, $injector.invoke хочет функцию в качестве параметра, так что я сделал это обернуть ngWrapProvider.wrapper('_'); внутри функции, то сделать что функция параметр для $injector.invoke.

Затем я создаю оператор it, который принимает/вводит новый сервис _ внутри него. И если это определено и приравнивается к моему макету window._, то могу сказать, что служба действительно была создана и ссылается на правильный объект в глобальной области.

Ниже приводится фактический код, который я использовал.

describe('wrapper method', function() { 
    ... 
    describe('with window.property', function() { 
    beforeEach(inject(function($injector) { 
     window._ = mocks.windowProperty; 
     $injector.invoke(function() { 
     ngWrapProvider.wrapper('_'); 
     }); 
    })); 

    it('should expose window.property as an angular service', inject(function(_) { 
     expect(_).toBeDefined(); 
     expect(_).toEqual(mocks.windowProperty); 
    })); 

    ... 
    }); 
}); 
Смежные вопросы