Модульное тестирование AngularJS с $httpBackend дает ошибку: неожиданный запрос

Я собираюсь предварить этот вопрос, сказав, что у меня уже есть тест для моего «LoginCtrl», который выполняет почти ту же задачу. Я уверен, что это проблема чего-то очень маленького, что я упустил из виду. Заранее благодарю за любую помощь :)

Я установил ожидаемое значение/ответ для httpBackend для своего теста, но когда я запускаю httpBackend.flush(), я как будто никогда не устанавливал ожидание.

Тестовый код:

describe('user register', function () {
    var scope, RegisterCtrl, httpBackend, userJohnDoe, userJohnDoeRegistered, Restangular;


    // TEST
    beforeEach(module('LR.User.Register'));


    describe('RegisterCtrl', function () {
        beforeEach(inject(function ($controller, _$httpBackend_, $rootScope, _Restangular_, $state) {
            scope = $rootScope.$new();
            httpBackend = _$httpBackend_;
            Restangular = _Restangular_;

            // Models
            userJohnDoeRegistered = {
                "access_token": "YzEyZDhjNjBlY2EwMTMxMmQzZGIzYWY5NDY4OGYwMjMzMGVjNDU3MDVhY2U0YjJmNDc1ODI3NWU0ODkzZGNkMQ",
                "expires_in": 7200,
                "token_type": "bearer",
                "scope": null,
                "refresh_token": "MmFhMTQ5NzU4ODI5ZjE2Mjk3ZjNlYzEwYzJkMjc4M2NkZjY2MjVkMjIwNWQzODUxYWNiYzY3NzIyMzEwYzJhNg",
                "user": {
                    "username": "johndoe",
                    "email": "[email protected]",
                    "id": 1,
                    "first_name": "John",
                    "middle_name": "f",
                    "last_name": "Doe",
                    "created": "2013-09-04T10:46:10-0500",
                    "updated": "2013-09-04T10:46:10-0500"
                },
                "status": "success",
                "status_code": 200,
                "status_text": "OK"
            };
            userJohnDoe = {
                "email": "[email protected]",
                "first_name": "John",
                "middle_name": "f",
                "last_name": "Doe",
                password: 'test123X',
                passwordSecond: 'test123X',
                client_id: '1_3b5zgimwg4kkko4wksk4sw0o48040o8ws8og8kg4wsowwkc44s'
            };

            httpBackend.whenPOST('/register', userJohnDoe).respond(userJohnDoeRegistered);


            RegisterCtrl = $controller('RegisterCtrl', {$scope: scope, $state: $state, Restangular: Restangular});
        }));
        afterEach(function () {
            httpBackend.verifyNoOutstandingExpectation();
            httpBackend.verifyNoOutstandingRequest();
        });


        it('should be able to register a fake user', inject(function () {
            var resolvedRegistration;
            var cb = function (response) {
                // Expect the userJohnDoe object
                resolvedRegistration = sanitizeRestangularOne(response);

                console.log(logTestHeader('REGISTRATION RESPONSE') +
                    JSON.stringify(resolvedRegistration, null, '   '));
            };

            // Set credentials
            scope.user = userJohnDoeCredentials;

            // Call login
            var register = scope.register_user().then(function() {
                cb();
            });
            scope.$digest();
            httpBackend.flush();
            expect(resolvedRegistration).toEqual(userJohnDoeRegistered);
        }));
    });


});

Выходной ответ:

Chrome 29.0.1547 (Mac OS X 10.8.4) user register RegisterCtrl should be able to register a fake user FAILED
    Error: Unexpected request: POST /register
    No more request expected
        at Error (<anonymous>)
        at $httpBackend (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular-mocks/angular-mocks.js:959:9)
        at y (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:64:282)
        at g (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:62:272)
        at r (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:96:140)
        at r (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:96:140)
        at /Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:97:293
        at Object.g.$eval (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:104:502)
        at Object.g.$digest (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:102:419)
        at null.<anonymous> (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/src/app/user/register/register.spec.js:74:19)
    Error: Declaration Location
        at window.jasmine.window.inject.angular.mock.inject (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular-mocks/angular-mocks.js:1781:25)
        at null.<anonymous> (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/src/app/user/register/register.spec.js:57:54)
        at null.<anonymous> (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/src/app/user/register/register.spec.js:9:5)
        at /Users/bobothefrofro/Development/lr-phoenix/phoenix-client/src/app/user/register/register.spec.js:1:1

person robert.bo.roth    schedule 04.09.2013    source источник
comment
Разобрался с проблемой, смотрите мой ответ для информации.   -  person robert.bo.roth    schedule 04.09.2013


Ответы (2)


Моя первая мысль заключается в том, что что-то делает запрос, когда вы создаете экземпляр своего контроллера. Возможно, попробуйте добавить $httpBackend.flush() после строки объявления вашего контроллера и посмотрите, решит ли это проблему. Кроме того, должен ли ваш дайджест $scope.$ располагаться после $httpBackend.flush, а не перед ним?

person MBielski    schedule 04.09.2013
comment
Пытался переместить вызов flush(), но каждый раз, когда он вызывается до digest(), я получаю сообщение Нет ожидающего запроса на сброс! ошибка. Мне кажется, что моя декларация httpBackend.whenPOST по какой-то причине не срабатывает - person robert.bo.roth; 04.09.2013
comment
По умолчанию мой контроллер вызывает метод запроса, который и вызывал у меня эту проблему. - person Michael J. Calkins; 08.01.2014

Я узнал, что это было. моя функция register_user() ссылалась на $scope.user, которая была установлена ​​на неопределенную переменную: userJohnDoeCredentials (другое имя переменной, которое я использовал для моего предыдущего теста).

Не знаю, почему моя IDE не жаловалась на то, что я ссылаюсь на неопределенную переменную, и она проходила все мои тесты jslint, так что это тоже странно, но ладно. Это исправлено: D Только если бы теперь я мог получить фиктивный запрос, чтобы вернуть то, что я хочу...

person robert.bo.roth    schedule 04.09.2013
comment
Рад, что вы исправили это. Я чувствую твою боль от моков. Они совсем другое животное. - person MBielski; 02.04.2014