Я научился использовать Karma для тестирования моего приложения angularjs. Однако некоторые из моих контроллеров не используют несколько сервисов, которые являются http-запросами, которые извлекают json, который затем загружается на страницу. Я застрял из-за двух вопросов, на которые я не могу ответить. 1) Как мне имитировать эти сервисы? 2) что именно я должен проверить для своего контроллера. Вопрос 2 Мне сложно ответить, потому что функции контроллера зависят от служб, которые я использую в других контроллерах. Во всяком случае, позвольте мне показать один из моих контроллеров, а затем "библиотеку", в которой хранятся мои услуги:
Один из моих контроллеров
angular.module('ccApp')
.controller('CountriesCtrl', ['$scope', '$routeParams', '$location','countryInfo', 'getCountries', 'countriesCache', 'getNeighbors',
'buildCountry', '$timeout', '$q',
function($scope, $routeParams, $location, countryInfo, getCountries, countriesCache, getNeighbors,
buildCountry, $timeout, $q){
getCountries.countriesObject.then(function(response){
$scope.geocountries = response.data.geonames;
},
function(response){
alert("error");
});
$scope.toCountry = function(geocountry){
getNeighbors(geocountry.geonameId)
.then(function(response){
buildCountry(geocountry, response);
var path = '/countries/'+countryInfo.name+'/capital';
$location.path(path);
}),
function(response){
alert('Error');
};
};
$scope.goHome = function(){
$location.path('/');
};
}]);
Что я должен проверить в спецификации контроллера?
Здесь библиотека, где размещаются услуги:
angular.module('library', [])
.service('countryInfo', function(){
var country = {
name: '',
pop: '',
area: '',
capital: '',
code: '',
capPop: '',
numNeigh: 0,
neighbors: []
};
return country;
})
.factory('countriesCache', ['$cacheFactory', function($cacheFactory){
return $cacheFactory('countriesCached');
}])
.factory('getCountries', ['$http', function($http){
var request = {
username: 'vman'
};
return { countriesObject : $http({
method: 'GET',
url: 'http://api.geonames.org/countryInfoJSON',
params: request
})};
}])
.factory('getCountry', ['$http', function($http){
return function(countryCode){
return $http({
method: 'GET',
url: 'http://api.geonames.org/countryInfoJSON',
params: { username: 'vman', country: countryCode }
});
};
}])
.factory('getNeighbors', ['$http', function($http){
return function(geonameId){
return $http({
method: 'GET',
url: 'http://api.geonames.org/neighboursJSON',
params: { username: 'vman', geonameId: geonameId }
});
};
}])
.factory('buildCountry', ['countryInfo', '$q', '$timeout', function(countryInfo, $q, $timeout){
return function(geocountry, response){
countryInfo.name = geocountry.countryName;
countryInfo.code = geocountry.countryCode;
countryInfo.pop = geocountry.population;
countryInfo.area = geocountry.areaInSqKm;
countryInfo.capital = geocountry.capital;
countryInfo.neighbors = response.data.geonames;
countryInfo.numNeigh = response.data.geonames.length;
};
}])
.run(['$rootScope', '$location', function($rootScope, $location) {
$rootScope.$on('$routeChangeError', function() {
$location.path('/error');
});
}]);
Следующий фрагмент создает макет вышеуказанной услуги:
модуль (функция ($)). $ service.service('demoService', function() {this.isDemoApi = jasmine.createSpy('isDemoApi');});});
//Получение ссылки на издеваемую службу
var mockDemoSvc;
inject(function(demoService) {
mockDemoSvc = demoService;
});
Чтобы протестировать контроллер, во-первых, вам придется издеваться над всеми услугами, которые использует этот контроллер, используя приведенный выше код. Это поможет тестировать контроллеры API отдельно. Затем вы можете проверить API, привязанные к области, например: toCountry()