3

我对 AngularJS 相当陌生,并且正在尝试学习一些最佳实践。我有一些工作,但想开始向我的模块和控制器添加一些单元测试。我要解决的第一个问题是我的 AuthModule。

我有一个 AuthModule。该模块注册了一个名为“AuthModule”的工厂,并公开了“setAuthenticatedUser”之类的内容以及“isLoggedIn”和“currentUser”之类的字段。我认为这是 AngularJS 应用程序中相当常见的模式,在具体实现细节上有一些变化。

authModule.factory('AuthModule', function(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?我遇到了困难,因为我不断收到对我的 /keepalive 函数(在 APIService.keepAlive() 中调用)的意外 POST 请求?

有什么方法可以使用 $httpBackend 来对实际的 KeepAlive 调用返回正确的响应?这会阻止我模拟 API 服务吗?

我是否应该将 .run() 块从 AuthModule 中获取当前登录用户并将其放入主应用程序中?似乎无论我将 run() 块放在哪里,我似乎都无法在加载模块之前初始化 $httpbackend?

AuthModule 甚至应该是它自己的模块吗?还是我应该只使用主应用程序模块并在那里注册工厂?

4

1 回答 1

2

运行块是 Angular 中最接近 main 方法的东西。运行块是需要运行以启动应用程序的代码。它在所有服务都配置好并创建注入器后执行。运行块通常包含难以进行单元测试的代码,因此应该在独立的模块中声明,以便在单元测试中可以忽略它们。angularjs 文档

我建议你看看这个身份验证服务,使用服务是要走的路。

希望这会有所帮助......祝你好运

于 2014-02-04T14:23:33.907 回答