#javascript #angularjs #unit-testing #jasmine #karma-jasmine
#javascript #angularjs #модульное тестирование #jasmine #карма-jasmine
Вопрос:
Я написал службу, которая обрабатывает данные с помощью API. Я завершил success response
модульное тестирование для того же, но столкнулся с проблемами с модульным тестированием 404 Error Response
.
Пожалуйста, обновите ответ реальными сценариями в соответствии с вопросом. У меня уже есть несколько обучающих программ, но они не помогают.
Вот мой сервисный код:
angular.module('myApp').service('SizingService',
function (SizerGatewayApi, RestDomains, $q, UnitySizerService) {
let api = new SizerGatewayApi(GatewayUrl);
return {
postSizingResults: postSizingResults
};
function postSizingResults(unitySizerDTO) {
let deferred = $q.defer();
function handleSuccessResponse(data) {
deferred.resolve(data);
UnitySizerService.resultSummary = data;
}
function handleErrorResponse(response) {
//Not able to cover UT for 404
if (response.status === 404) {
deferred.resolve(response.body);
} else {
deferred.reject(response);
}
}
api.post({dto: unitySizerDTO}).then(handleSuccessResponse, handleErrorResponse);
return deferred.promise;
}
}
);
Вот мой файл спецификации
describe('SizingService', function () {
beforeEach(module('basic-unity-replication-sizer-ui'));
let data = {
// response data
};
let SizerGatewayApiStub;
let unitySizerDTO = {
//post dto
};
let rootScope;
let $scope;
let SizingService;
let $q;
beforeEach(function () {
module(function ($provide) {
SizerGatewayApiStub = function () {
this.post = function (value) {
let deferred = $q.defer();
if (value.dto !== 'failure') {
deferred.resolve({data: data});
} else {
deferred.reject("no data");
}
return deferred.promise;
};
};
$provide.value('SizerGatewayApi', SizerGatewayApiStub);
});
inject(function (_$q_, $rootScope, _SizingService_) {
$q = _$q_;
rootScope = $rootScope;
$scope = $rootScope.$new();
SizingService = _SizingService_;
});
});
describe('should handle response', function () {
it('success', inject(function (SizingService) {
SizingService.postSizingResults(unitySizerDTO);
$scope.$apply();
expect(data).toBeDefined();
expect(data).not.toBeNull();
}));
//404 Failure scenarios needs to be covered by UT
it('failure', inject(function (SizingService) {
SizingService.postSizingResults(postWrongDTO);
$scope.$apply();
}));
});
});
Комментарии:
1. В чем именно заключается ваш вопрос?
2. Требуется модульное тестирование сценариев успеха и сбоя вышеупомянутой службы.
3. как модульно протестировать эти функции
function handleSuccessResponse(data) { deferred.resolve(data); UnitySizerService.resultSummary = data; } function handleErrorResponse(response) { //Not able to cover UT for 404 if (response.status === 404) { deferred.resolve(response.body); } else { deferred.reject(response); } }
4. Вам нужно четко сформулировать проблему.
5. Почему вы хотите успешно разрешить promise для
500
ошибки?
Ответ №1:
На самом деле мне трудно понять ваш код, но я «думаю», что вы захотите сделать, это установить шпион на SizerGateWayApiStub.post и вернуть отклоненное обещание.
Что-то подобное должно привести вас на правильный путь:
Добавьте переменную let postDeferred;
Затем в вашем перед каждым внедрением вы захотите настроить шпиона
postDeferred = $q.defer();
spyOn(SizerGatewayApiStub, 'post').and.returnValue(postDeferred.promise);
Тогда в вашем тесте вы бы сделали что-то вроде этого
it('failure', inject(function (SizingService) {
let mockResponse = {
status = "404",
body = "somevalue"
};
let result = SizingService.postSizingResults(postWrongDTO);
postDeferred.reject(mockResponse);
$scope.$apply();
expect(SizerGatewayApiStub.post).toHaveBeenCalled();
expect(result).toEqual(mockResponse.body);
}));
});