#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 .