Я искал в интернете, но не нашел решения, которое работает для меня.Ситуация такова, что у меня есть компонент с контроллером.Я могу использовать Jasmine для проверки того, что контроллер создан, и я также могу без проблем вызвать хук $ onInit.
Однако, когда я пытаюсь вызвать функцию компонента, которая использует сервисную функцию, которая возвращает обещание,вещи терпят неудачу с треском.Я использую следующие версии:
AngularJS v1.5.11 Jasmine v3.3.0 Karma v3.1.4
Мой упрощенный компонент:
(function ()
{
"use strict";
angular
.module("app")
.component("MyComponent", {
controller: "MyController"
})
.controller("MyController", MyController);
function MyController(MyService)
{
"ngInject";
var vm = this;
vm.$onInit = $onInit;
vm.onPaginate = onPaginate;
function $onInit()
{
vm.data = [];
}
function onPaginate()
{
getData();
}
function getData()
{
MyService.getData().then(onComplete);
function onComplete(response)
{
vm.data = response.list;
}
}
}
})();
Функция MyService.getData
запрашивает REST API для получения некоторых данных.Он вернет обещание, которое будет разрешено при получении данных.Все это работает в приложении.
Я хочу протестировать функцию MyController.onPaginate
и написал следующую спецификацию теста Jasmine:
describe("MyComponent: MyController", function ()
{
var $componentController, $rootScope, $q, $scope;
var componentBindings = {
};
var data = {
list: [{
"id": 23,
}],
total_count: 1
};
var mock_MyService = {
getData: function ()
{
return $q.resolve(data);
}
};
beforeEach(function ()
{
angular.mock.module("app", function ($provide)
{
$provide.value("MyService", mock_MyService);
});
angular.mock.inject(function ($injector)
{
$q = $injector.get("$q");
$componentController = $injector.get("$componentController");
$rootScope = $injector.get("$rootScope");
$scope = $rootScope.$new();
});
});
it("should retrieve data", function ()
{
var $ctrl = $componentController("MyComponent", { $scope: $scope, MyService: mock_MyService }, componentBindings);
$ctrl.$onInit();
$ctrl.onPaginate($ctrl.tableState);
$scope.$apply();
expect($ctrl.data.length).toEqual(1);
});
});
При запуске я получаю сообщение об ошибке:
TypeError: e is not a function
at <Jasmine>
at b.$apply (node_modules/angular/angular.min.js:147:388)
at UserContext.<anonymous> (myComponent.spec.js:...)
at <Jasmine>
Так как я могу проверить это правильно?