Модульный тест Angular Karma: как внедрить фиктивный сервис в конфигурацию кармы, а не во все тестовые спецификации

Недавно я добавил функцию безопасности в существующее приложение angular. Вот что у меня получилось после:

Chrome 3X.0.2125 (Linux) ERROR
  Some of your tests did a full page reload!
Chrome 3X.0.2125 (Linux): Executed 23 of 102 (skipped 2) ERROR 

Вот как я настроил функцию безопасности:

angular.module('myapp', [/*..I have omitted..*/])
       .run(function(MyLoginSerivce, /*.. I have omitted ..*/)){
           if(!MyLoginService.isLoggedIn()){
               MyLoginService.redirectForLogin();
           }else{
               /* other logics */
           }
       }

Я знал, что должен добавить следующий код в каждую тестовую спецификацию. Но глупо добавлять его к десяткам тестовых файлов.

  beforeEach(module(function($provide){
    $provide.value("MyLoginServce", {
      isLoggedIn: function(){
        return true;
      },
      redirectForLogin: function {}
    });
  }));

Есть ли способ сказать Karma, что вы используете фиктивный сервис и добавляете этот фрагмент кода только один раз и в одном месте?

Спасибо

Текущее решение

Шаг 1: Я сохранил это в отдельном файле, например. ./test/mocked.login.service.js:

   var mockedLoginService = {
      isLoggedIn: function(){
        return true;
      },
      redirectForLogin: function {}
    });

Шаг 2: я включаю файл в karma.conf.js, вставив «test/mocked.login.service.js».

Шаг 3: я просто использую его в своих тестах следующим образом:

  beforeEach(module(function($provide){
    $provide.value("MyLoginServce", mockedLoginService
  }));

person chfw    schedule 30.03.2015    source источник


Ответы (1)


Вы можете извлечь смоделированный сервис в отдельный файл js как объект, включить этот файл в список файлов karma.conf, а затем использовать этот объект как глобальный в своих спецификациях.

person pansay    schedule 23.08.2015