2013-10-08 1 views
3

Я довольно новичок в AngularJS, и я пытаюсь изучить некоторые лучшие практики. У меня все работает, но хотелось бы добавить некоторые модульные тесты для моих модулей и контроллеров. Первый, который я ищу, - это мой AutmMule.Единичное тестирование angularJS, где run содержит HTTP-запрос?

У меня есть AuthModule. Этот модуль регистрирует фабрику под названием «AuthModule» и предоставляет такие вещи, как «setAuthenticatedUser», а также такие поля, как «isLoggedIn» и «currentUser». Я думаю, что это довольно распространенная картина в приложении AngularJS с некоторыми вариантами конкретных деталей реализации.

authModule.factory ( 'AuthModule', функция (APIService, $ rootScope) {

var _currentUser = null; 
    var _isLoggedIn = false; 

    return { 
    'setAuthenticatedUser' : function(currentUser) { 

     _currentUser = currentUser; 
     _isLoggedIn = currentUser == null ? false : true; 

     $rootScope.$broadcast('event:authenticatedUserChanged', 
      _currentUser); 

     if (_isLoggedIn == false) { 
     $rootScope.$broadcast('event:loginRequired') 
     } 

     $rootScope.authenticatedUser = _currentUser; 
     $rootScope.isLoggedIn = _isLoggedIn; 

    }, 
    'isLoggedIn' : _isLoggedIn, 
    'currentUser' : _currentUser 
    } 
}); 

Модуль имеет некоторые другие вещи, как зарегистрировать обработчик для события "loginRequired", чтобы отправить человека обратно на главном экране. Эти события поднятый AuthModule завода.

authModule.run(function($rootScope, $log, $location) { 
    $rootScope.$on("event:loginRequired", function(event, data) { 
    $log.info("sending him home. Login is required"); 
    $location.path("/"); 
    }); 
}); 

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

authModule.run(
    function(APIService, $log, AuthModule) { 
     APIService.keepAlive().then(function(currentUser) { 
     AuthModule.setAuthenticatedUser(currentUser.user); 
     }, function(response) { 
     AuthModule.setAuthenticatedUser(null); 
     }); 
    }); 

Вот некоторые из моих вопросов:

Мой вопрос как бы вы тесты для этой установки? Я бы подумал, что мне нужно будет выкачать APIService? Мне тяжело, потому что я постоянно получаю неожиданный запрос POST к моей/активной функции (вызванный в APIService.keepAlive())?

Есть ли способ использовать $ httpBackend, чтобы вернуть правильный ответ на фактический вызов KeepAlive? Это помешало бы мне отмахиваться от службы API?

Должен ли я вытащить блок .run(), который получает текущий вход в систему пользователя из AuthModule и помещает его в основное приложение? Кажется, независимо от того, где я помещаю блок run(), я не могу инициализировать $ httpbackend, прежде чем загружать модуль?

Должен ли AuthModule быть его собственным модулем? или я должен просто использовать основной модуль приложения и зарегистрировать там завод?

ответ

2

Запуск блоков является самым близким в Угловом для основного метода. Блок запуска - это код, который нужно запустить для запуска приложения. Он выполняется после настройки всей службы и создания инжектора. Блоки запуска обычно содержат код, который трудно тестировать, и по этой причине должны быть объявлены в изолированных модулях, чтобы их можно было игнорировать в модульных тестах. angularjs docs

Предлагаю вам ознакомиться с этим authentication service, используя услугу - это путь.

Надеюсь, это поможет ... Удачи

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