4

В настоящее время у меня есть служба, которая зависит от переменной, установленной в $ cookies. Однако, когда я хочу выполнить модульное тестирование взаимодействия между службой и значением, хранящимся в $ cookies, служба всегда инициализируется до фактической инициализации значения $ cookie.

Итак, мой вопрос: как я могу самостоятельно проверить взаимодействие между службой и значением $ cookie? (например: как я могу установить значение в $ cookie до инициализации моей службы?)

Примечание: Я использую Angular 1.2 и Karma для модульного тестирования.

ответ

2

Единственный способ я нашел, который работает с сервисами (в отличие от контроллеров), является использование декоратора на $cookieStore во модуле, установленном в beforeEach.

anagular-издевается давайте настраивать наши модули в спецификации аналогичным образом, как мы делаем в коде, за исключением того, что вместо того, чтобы использовать функцию config, мы передаем функцию в качестве второго аргумента функции module мы используем для вызывают наш модуль в жасмине.

Это будет выглядеть следующим образом:

describe ('my service', function() { 
    var $cookieStore, 
     myService 

    beforeEach(module ('myModule', function ($provide) { 
     // this function configures the "myModule" module before any 
     // injectables are created. 

     // We use a decorator to access the cookie store before other 
     // services are instantiated. 
     $provide.decorator ('$cookieStore', function ($delegate) { 
      // at this point the "$cookieStore" service has only just 
      // been constructed, and is accessible here as "$delegate". 
      // Services that have "$cookieStore" as an injected 
      // dependency have not been instantiated yet, so we 
      // can slip our cookie in now. 
      $delegate.put ('favorite-cookie', 'oatmeal'); 
      return $delegate; 
     }); 
    })); 

    beforeEach (inject (function (_$cookieStore_, _myService_) { 
     myService = _myService; 
     $cookieStore = _$cookieStore_; 
    } 

    it ('should interact with the pre-existing "favorite-cookie" cookie', function() { 
     // your expectations go here. 
    }); 

    afterEach(function() { 
     // clean up 
     $cookieStore.remove ('favorite-cookie'); 
    }); 


}); 
+0

Будет ли это работать для директивы в Angular 1.3? – atwright147

6

Я создал пример в JSFiddle, который, я надеюсь, поможет вам в решении вашей проблемы.

link

//--- CODE -------------------------- 
angular.module('myapp.test', [], function() { 

}).controller('testcont', function($scope, $cookies) { 
    // Read a cookie and do something with it 
    $scope.favoriteCookie = $cookies.myFavorite; 
}); 

// --- SPECS ------------------------- 

describe('controllers', function(){ 
    var scope; 
    beforeEach(angular.mock.module('ngCookies', 'myapp.test')); 
    beforeEach(inject(function($controller, $rootScope, $cookies){  
    // Setting a cookie for testing 
    $cookies.myFavorite = 'oatmeal'; 
    scope = $rootScope.$new(); 
     $controller('testcont', {$scope:scope, $cookies: $cookies}); 
    })); 

    it('sets the cookie on the scope', function(){ 
     expect(scope.favoriteCookie).toBe('oatmeal');  
    }); 
}); 
+0

привет вы можете объяснить, почему использование $ печенье: $ печенье? почему это не $ cookie: файлы cookie, такие как $ scope: scope. почему у них нет $ rootScope. $ new() как operetaion? – user4232

+0

Ключ свойства - это имя инъекционного компонента, например. "$ Сфера". Значение свойства - это введенный экземпляр. В приведенном выше случае я ввел $ cookie в функцию, поэтому я использовал это как инъецируемый экземпляр. Это просто вопрос обозначения варов, используемых в качестве экземпляров –

+0

. Спасибо за ответ. – user4232

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