Неудовлетворенные запросы при тестировании angularJS с Jasmine

Я пытаюсь написать, какие тесты, если пользователь использует правильный логин/пароль:

describe('LoginController', function () {
    beforeEach(angular.mock.module('task6'));

    var $rootScope, 
        $controller, 
        LoginService, 
        $httpBackend, 
        $resource, 
        $scope, 
        $controller;

    afterEach(function () {
        $httpBackend.verifyNoOutstandingExpectation();
        $httpBackend.verifyNoOutstandingRequest();
    });

    beforeEach(inject(function (_$rootScope_, 
                                _$controller_, 
                                _LoginService_, 
                                _$httpBackend_, 
                                _$resource_) {
        $rootScope = _$rootScope_;
        $controller = _$controller_;
        LoginService = _LoginService_;
        $httpBackend = _$httpBackend_;
        $resource = _$resource_;

        $scope = $rootScope.$new();
        controller = $controller('LoginController', {
                $scope: $scope
            });
    }));

    describe('LoginController.submitLogin', function () {

        var user = [
            {
                "login": "root",
                "password": "1234"
            }
        ];

        it('tries to login with right login/pass', function () {
            $httpBackend.expectGET(/users.json/)
                .respond(200, user);

            controller.loginField = 'John';
            controller.password = 'Smith';

            controller.submitLoginForm()
                .then(function () {
                    expect($rootScope.logged).toBe(false);
                })
                .catch(function () {
                    console.log.bind(console);
                });


            $httpBackend.flush();
        });

        it('tries to login with right login/pass', function () {

            $httpBackend.expectGET(/users.json/)
                .respond(200, user);

            controller.loginField = 'root';
            controller.password = '1234';

            controller.submitLoginForm()
                .then(function () {
                    expect($rootScope.logged).toBe(true);
                })
                .catch(function () {
                    console.log.bind(console);
                });
            $httpBackend.flush();
        });
    });
});

Вот функции, которые я использую в тесте. В контроллере:

self.submitLoginForm = function() {
    return LoginService.signIn(self.loginField, self.password)
        .then(function() {
            if(!$rootScope.logged) {
                self.loginError = true;
            }
        })
        .catch(console.log.bind(console));
};

А в сервисе:

    var UsersResource = $resource('assets/data/users.json');

    function getUsers() {
        $httpBackend.expectGET(/users.json/);
        return UsersResource.query().$promise;

    }

    function signIn(loginField, password) {

        return getUsers()
            .then(function(users) {
                for (var i = 0; i < users.length; i++) {
                    if (users[i].login == loginField && users[i].password == password) {
                        $rootScope.logged = true;
                        $rootScope.user = users[i].login;
                        $location.path('/courses');
                        return true;
                    }
                }
                return false;
            })
            .catch(function () {
                console.log("Error: Users array wasn't retrieved from the server");
            });
    }

test работает хорошо, пока не завершится успешно, в противном случае он завершается с ошибкой:

Ошибка: Неудовлетворенные запросы: GET /users.json/

первый указывает на строку 59 и строку 13, второй на строки 77 и 13

Благодарю вас!


person Vladimir Mironov    schedule 21.01.2016    source источник


Ответы (1)


Итак, проблема была в этой функции:

function getUsers() {
    $httpBackend.expectGET(/users.json/);
    return UsersResource.query().$promise;
}

Поскольку я ожидаю запроса как в этой функции, так и в тесте, он ожидает два запроса, а второй никогда не выполняется. $httpBackend.flush() замечает это, и $httpBackend.verifyNoOutstandingExpectation() тоже.

person Vladimir Mironov    schedule 22.01.2016