#angularjs #unit-testing #jasmine #karma-jasmine
#angularjs #модульное тестирование #jasmine #карма-жасмин
Вопрос:
Я новичок в тестировании Jasmine, здесь я хочу протестировать свои $ resources на фабрике, поэтому сначала у меня есть эта фабрика :
angular.module('starter.services', [])
.factory('API', function($rootScope, $resource) {
var base = "http://192.168.178.40:8000/api";
return {
getGuestListForH: $resource(base '/guests/:id/:wlist', {
id: '@id',
wlist: '@wlist'
})
}
});
и мой тест :
beforeEach(module('starter.services'));
describe('service: API resource', function() {
var $scope = null;
var API = null;
var $httpBackend = null;
beforeEach(inject(function($rootScope, _API_, _$httpBackend_) {
$scope = $rootScope.$new();
API = _API_;
$httpBackend = _$httpBackend_;
$httpBackend.whenGET('http://192.168.178.40:8000/api/guests').respond([{
id: 1,
name: 'a'
}, {
id: 2,
name: 'b'
}]);
}));
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
it('expect all resource in API to br defined', function() {
$httpBackend.expect('http://192.168.178.40:8000/api/guests');
var dd = API.getGuestListForH.query();
expect(dd.length).toEqual(2);
expect(API.getGuestListForH).toHaveBeenCalled();
});
});
и я получил в результате :
- Ожидается, что 0 будет равно 2
- Ожидаемый шпион, но получил функцию, что здесь не так.Я хочу протестировать ресурс на заводе, каков наилучший способ сделать это ?!
Ответ №1:
Ваши тесты могут работать даже без $rootScope
и всех других объявлений переменных, которые вы сделали.
И поскольку вы пишете тесты для метода сервиса, вместо expect
того, чтобы его редактировать toHaveBeenCalled
, вы должны вызвать его и ожидать, что результаты будут чем-то.
Что-то вроде этого:
describe('Service: starter.services', function() {
beforeEach(module('starter.services'));
describe('service: API resource', function() {
beforeEach(inject(function(_API_, _$httpBackend_) {
API = _API_;
$httpBackend = _$httpBackend_;
$httpBackend.whenGET('http://192.168.178.40:8000/api/guests').respond([{
id: 1,
name: 'a'
}, {
id: 2,
name: 'b'
}]);
}));
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
it('expect all resource in API to br defined', function() {
var dd = API.getGuestListForH.query();
$httpBackend.flush();
expect(dd.length).toEqual(2);
});
});
});
Надеюсь, это поможет.
Комментарии:
1. Большое спасибо за ответ, ваше решение работает, но если я случайно удалю параметры в ресурсе (id, wlist) в сервисном модуле, этот тест всегда будет возвращать успех, и я думаю, что цель тестирования — показать подобные ошибки. Каково ваше мнение?