Мне было интересно, как следует тестировать с помощью теста Karma с маршрутизатором Angular.js + UI?
У меня определено следующее состояние: у которого есть два разрешения, которые извлекают некоторые данные и подготавливают данные для контроллера. (Исходя из Ember, это имеет большой смысл.)
$stateProvider
.state('users', {
resolve: {
getData: function (User) {
return User.query().$promise
},
stateModels: function (getData) {
var models = {}
models.users = getData
return models
}
},
url: '/',
templateUrl: '/views/users/index.html',
controller: 'UsersIndexCtrl'
})
Наш UserIndexCtrl выглядит следующим образом: (который принимает разрешенное состояниеModels и присваивает его переменной $scope, поэтому представление может использовать его)
app.controller('UsersIndexCtrl', [
'$scope', '$state', 'stateModels',
function ($scope, $state, stateModels) {
$scope.users = stateModels.users
}])
Это отлично работает в браузере, я вижу правильные результаты. Однако, когда дело доходит до тестирования, это дает мне нечетные ошибки.
Вот пример Karma unit test:
describe('controllers', function () {
var $httpBackend
, $rootScope
, $scope
, $state
, $httpBackend
, $controller
beforeEach(module('app'))
beforeEach(inject(function ($injector) {
$state = $injector.get('$state')
$rootScope = $injector.get('$rootScope')
$httpBackend = $injector.get('$httpBackend')
$scope = $rootScope.$new()
$controller = $injector.get('$controller')
}))
it('UserIndexCtrl should exist', inject(function () {
$httpBackend
.expect('GET', '/api/users')
.respond(200, {users: [ {}, {}, {} ]})
$state.go('users')
$rootScope.$apply()
$controller('AdminZonesIndexCtrl', { $scope: $scope, $state: $state });
$rootScope.$apply()
assert.equal($scope.users.length, 3)
}))
})
И я вижу:
[$injector:unpr] Unknown provider: stateModelsProvider <- stateModels
http://errors.angularjs.org/1.3.0-build.2937+sha.4adc44a/$injector/unpr?p0=stateModelsProvider%20%3C-%20stateModels
Error: [$injector:unpr] Unknown provider: stateModelsProvider <- stateModels
http://errors.angularjs.org/1.3.0-build.2937+sha.4adc44a/$injector/unpr?p0=stateModelsProvider%20%3C-%20stateModels
Идея здесь:
- Мы изматываем запрос API, чтобы GET-запросы к /api/users возвращали массив из 3 объектов.
- Идем в состояние с именем users
- Мы ожидаем увидеть, что $scope.users должны быть массивом из трех объектов.
- В этом тесте мы протестировали как разрешения, определенные в маршрутизаторе, так и контроллер правильно назначил разрешенные объекты.
Спасибо Билл