Ответ 1
Решение состоит в том, чтобы перенести перенаправление на API в служебную функцию и издеваться над ним в тесте, чтобы сохранить URL-адрес переадресации в переменной службы, а затем выставить его через метод getter для теста вместо перенаправления на он.
Макет может выполняться внутри тела тестирования:
module('myApp.services.mock', function($provide){
var __service = function(){
var __data;
return{
getFn: function(){
return __data;
},
setFn: function: function(data){
__data = data;
}
}
}
$provide.value('someService', __service);
});
но я решил отделить этот макет с его собственной моделью, чтобы улучшить структуру и модульность
'use strict';
angular.module('myApp.services.mock', ['urlConfig']).
factory('utils', function(API_URL, $location, $rootScope, $window){
var __redirectURL = $window.location.href;
var utilsMock = {
getBaseUrl: function(){
return API_URL;
},
getLocationHref: function(){
return __redirectURL;
},
setLocationHref: function(redirectURL){
$rootScope.$apply(function(){
__redirectURL = redirectURL;
});
},
cleanSocialSearch: function(){
$location.search('auth_success', null);
$location.search('auth_error', null);
$location.search('auth_media', null);
$location.search('personalShare', null);
$location.search('groupShare', null);
}
}
return utilsMock;
});
-
__app.directive('socialAuth', function(utils, $location){
return{
restrict: 'A',
scope: false,
link: function(scope, elem, attrs){
elem.bind('click', function(){
utils.cleanSocialSearch();
if(attrs.checkbox == 'personal'){
scope.$apply(function(){
scope.model.personalShare[attrs.network] = true;
$location.search('personalShare', '1');
});
}
else if(attrs.checkbox == 'group'){
scope.$apply(function(){
var __index = attrs.checkbox + '_' + attrs.network;
scope.model.personalShare[__index] = true;
$location.search('groupShare', '1');
});
}
var callback = encodeURIComponent(utils.getLocationHref());
var loginUrl = utils.getBaseUrl() + '/social/login/' + attrs.network + '?success_url=' + callback;
utils.setLocationHref(loginUrl);
});
}
}
});
И, наконец, тест:
describe('socail-auth', function(){//FB
var scope, compiled, linkFn, utils, html, elem, elemPersonal, elemGroups, compile, authService, utilsMock, _window, BASE_URL, __network;
__network = 'facebook';
html = "<span data-social-auth data-network='" + __network + "'></span>";
beforeEach(function(){
module('urlConfig');
module('myApp.services.mock');
module('myApp.directives');
inject(function($compile, $rootScope, $injector){
scope = $rootScope.$new();
utils = $injector.get('utils');
_window = $injector.get('$window');
BASE_URL = $injector.get('API_URL');
linkFn = $compile(angular.element(html));
elem = linkFn(scope);
// scope.$digest();
elem.scope().$apply()
});
})
it("should redirect user to social login url at the backend", function(){
elem.click();
//scope.$digest();
var loginUrl = BASE_URL + '/social/login/' + __network + '?success_url=' + encodeURIComponent(_window.location.href);
expect(utils.getLocationHref()).toEqual(loginUrl);
});
});