ответ на сбой uni test 404 с angular service jasmine

#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);            
    }));
});