我对 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 甚至应该是它自己的模块吗?还是我应该只使用主应用程序模块并在那里注册工厂?