Модульный тест Angular http.post с данными в заголовке

Я пытаюсь написать модульный тест для службы, которая выполняет http.post для API, который передает учетные данные в заголовке.

Контроллер:

app.controller('LoginController', function($scope, $http, signInService) {

    $scope.LogIn = function(usrnm, pwd) {
        signInService.authUser(usrnm, pwd)
        .success(function (data, status, headers, config) {
            // Display success message
            $scope.gotToAddress = data.successUrl;
        })
        .error(function (data, status, headers, config) {
           // Display error message
        }
    }
});

signInService:

app.service('signInService', function($http) {

    this.authUser = function (usrnm, pwd) {

        return $http({
            url: '/api/json/authenticate',
            method: "POST",
            data: '{}',
            headers: {
                'Content-Type': 'application/json',
                'X-app-Username': usrnm,
                'X-app-Password': pwd
            }
        });
    };
});

Модульный тест:

describe('mocking service http call', function() {
    beforeEach(module('myApp'));

    var LoginController, $scope;

    describe('with httpBackend', function() {
        beforeEach(inject(function($controller, $rootScope, $httpBackend) {
            $scope = $rootScope.$new();

            $httpBackend.when('POST', '/api/json/authenticate', {}, function(headers) {
            return {
                'Content-Type': 'application/json',
                'X-app-Username': 'admin',
                'X-app-Password': 'admin'
            };
        }).respond(200)

            LoginController = $controller('LoginController', { $scope: $scope });
            $httpBackend.flush();
        }));

        it('should set data to "things and stuff"', function() {
            expect($scope.data).toEqual({things: 'and stuff'});
        });
    });
});

При запуске теста я вижу следующую ошибку: http-вызов службы имитации »с ошибкой httpBackend: нет ожидающих запросов на сброс!


Контроллер со службой на .succeed:

app.controller('LoginController', function($scope, $http, signInService, cookieSrv) {

    $scope.LogIn = function(usrnm, pwd) {
        signInService.authUser(usrnm, pwd)
        .success(function (data, status, headers, config) {
            // Display success message
            var cookieID = 'myCookie';
            cookieSrv.createCookie(cookieID, data.token, 3, data.redirectUrl);
        })
        .error(function (data, status, headers, config) {
           // Display error message
        }
    }
});

cookieSrv.js

app.service('cookieSrv', function() {
    return {
        createCookie : function(cookieID, token, days, redirectUrl) {
            if (days) {
                var date = new Date();
                date.setTime(date.getTime()+(days*24*60*60*1000));
                var expires = "; expires="+date.toGMTString();
            }
            else var expires = "";
            document.cookie = cookieID+"="+token+expires+"; path=/";

            window.location.assign(redirectUrl)
        }
    }
});

person Oam Psy    schedule 13.05.2015    source источник


Ответы (1)


Ваш контроллер определяет метод logIn на $scope, но вы не вызываете эту функцию в тесте, и, следовательно, фактический HTTP-запрос не выполняется.

Измените тест, вызвав $scope.logIn перед вызовом flush

LoginController = $controller('LoginController', { $scope: $scope });
$scope.logIn("Test","test");  // Add this
$httpBackend.flush();
person Chandermani    schedule 13.05.2015
comment
добавил вашу рекомендацию и получил следующее при запуске теста: Системный вывод: Firefox 37.0.0 ERROR В некоторых из ваших тестов была полная перезагрузка страницы! - person Oam Psy; 13.05.2015
comment
Возможно, что-то в вашем коде контроллера делает это. Я вижу, вы установили переменную, например $scope.gotToAddress. - person Chandermani; 13.05.2015
comment
я думаю, это было потому, что в моем первоначальном вопросе я не включил службу файлов cookie, к которой я обращаюсь. успех сообщения, см. мой обновленный вопрос. - person Oam Psy; 13.05.2015
comment
ПОЧЕМУ вы используете window.location? Первое правило модульного тестирования — имитировать все зависимости. Вы должны полностью издеваться над cookieSrv. Также используйте сервис $location. - person Chandermani; 13.05.2015
comment
спасибо за разъяснение, ценю. Как мне издеваться над cookieSrv? - person Oam Psy; 13.05.2015
comment
Вы можете создать фиктивный объект cookieSrv самостоятельно или использовать jasmine syy - person Chandermani; 14.05.2015