Unittest контроллера AngularJS с Jasmine и Karma «Не может прочитать свойство ‘then’ неопределенного

#javascript #angularjs #jasmine #karma-jasmine

#javascript #angularjs #jasmine #karma-jasmine

Вопрос:

Я пытаюсь выполнить модульное тестирование контроллера angularjs и получаю это сообщение об ошибке при запуске Karma:

Не удается прочитать свойство ‘then’ неопределенного

Что я делаю не так? Извините, я впервые что-то тестирую.

Контроллер:

 angular
    .module('my')
    .controller('MyCtrl', MyController);

MyController.$inject = ['$scope', 'myFactory'];

function MyController($scope,myFactory) {

    $scope.thingy = {};

//[..]
    function getThingys() {
        myFactory.getThingys(function () {}).then(function (data) {
            //SUCCESS
            $scope.thingy = data;
        });
    } 
}
 

Тест:

 var scope;
var controller;
var mockedMyFactory;

beforeEach(module('my'));

beforeEach(module('my', function ($provide) {
    mockedMyFactory = {
        getThingys: jasmine.createSpy()
    };
    $provide.value('myFactory', mockedMyFactory);
}));

beforeEach(inject(function ($controller, $rootScope, myFactory) {
    scope = $rootScope.$new();
    controller = $controller('MyCtrl', {
        $scope: scope, myFactory
    });
}));

describe('this', function () {
    it('is a dummy spec', function () {
        expect(2   2).toEqual(4);
    });
});
 

Комментарии:

1. Я не понимаю, где вы издеваетесь над MyFactory.getThingys

2. Я думал, что делаю это здесь? beforeEach(модуль(‘my’, функция ($provide) { mockedMyFactory = { getThingys: jasmine.createSpy() <- }; $provide.value(‘MyFactory’, mockedMyFactory); }));

Ответ №1:

Чтобы издеваться над сервисом:

  var $httpBackend;
 var myFactory; 

 beforeEach(angular.mock.inject(function ($injector) {    
        // Set up the mock http service responses
        $httpBackend = $injector.get('$httpBackend');

        // backend definition common for all tests
        myFactory= $injector.get('myFactory');

        $httpBackend.when('GET', 'url for call').respond({mock data});
}

 afterEach(function () {
        $httpBackend.verifyNoOutstandingExpectation();
        $httpBackend.verifyNoOutstandingRequest();
    });
 

Комментарии:

1. Теперь я получаю «Uncaught SyntaxError: неожиданный идентификатор» для строки «макет данных». И почему я должен использовать angular.mock.inject, а не только angular.inject?

2. Вы должны заменить «фиктивные данные» образцом данных (например: {‘property1’: «value1», …. }. Вам не нужно использовать angular.mock.inject .