Тестирование контроллера компонента AngularJS с помощью Jasmine завершается неудачно, поскольку сервис возвращает обещание - PullRequest
0 голосов
/ 04 января 2019

Я искал в интернете, но не нашел решения, которое работает для меня.Ситуация такова, что у меня есть компонент с контроллером.Я могу использовать 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>

Так как я могу проверить это правильно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...