Дразня сервисный звонок от контроллера, Жасмин использует реальный сервис

0

Я пытаюсь проверить, что служба вызывается из контроллера с помощью шпиона и макета. Ошибка Жасмин, что он пытается вызвать фактический сервис? Что я делаю не так?

контроллер

angular.module('vsApp').controller('kitsCtrl', function ($scope, productsDataService) {

    productsDataService.getProducts("kit").success(function (data) {

        $scope.products = data;

    });

});

спекуляция

describe("Kits controller", function () {

    var productsDataServiceMock, $controllerConstructor, scope;

    beforeEach(module('vsApp'));

    beforeEach(inject(function ($controller, $rootScope) {

        $controllerConstructor = $controller;
        scope = $rootScope.$new();
        productsDataServiceMock = {

            getProducts: function(type) {return {};}
        };

    }));

    it('should call the products data service', inject(function () {

        var ctrl = $controllerConstructor('kitsCtrl', {$scope: scope, productsDataService: productsDataServiceMock});

        spyOn(productsDataServiceMock, 'getProducts').andCallThrough();

        expect(productsDataServiceMock.getProducts).toHaveBeenCalled();

    }));

});

ошибка

TypeError: 'undefined' is not a function (evaluating 'productsDataService.getProducts("kit").success(function (data) {

            $scope.products = data;

        })')
        at /**removed**/public/app/controllers/kitsCtrl.js:9
  • 0
    Это ваша настоящая спецификация или она очищена? $controllerConstructor кажется, не определен в тестовой функции.
  • 0
    @BroiSatse Моя ошибка обновлена.
Теги:
jasmine

1 ответ

0
Лучший ответ

В тесте есть две ошибки:

  1. Вы следите за макетом после того, как сконструировали контроллер, и, таким образом, после того, как контроллер вызвал макет.
  2. Контроллер ожидает, что служба вернет объект, имеющий метод success(), но ваш макет возвращает пустой объект. Таким образом, при вызове success(), поскольку этот метод не существует, генерируется исключение.

Мой совет: не создавайте макет. Шпион на реальном сервисе и использовать API реальных обещаний, а не обратные вызовы с успешным/обратным вызовом:

angular.module('vsApp').controller('kitsCtrl', function ($scope, productsDataService) {

    productsDataService.getProducts("kit").then(function (data) {
        $scope.products = data;
    });
});

а также

var $controller;

beforeEach(inject(function (_$controller_, $rootScope) {

    scope = $rootScope.$new();
    $controller = _$controller_;
}));

it('should call the products data service', inject(function(productsDataService, $q) {
    spyOn(productsDataService, 'getProducts').andReturn($q.when('someData'));
    $controller('kitsCtrl', {$scope: scope});

    expect(productsDataServiceMock.getProducts).toHaveBeenCalledWith('kit');
    expect($scope.products).toBe('someData');
}));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню