单元测试AngularJS与$ httpBackend给出“错误:意外请求”

时间:2013-09-04 16:41:30

标签: angularjs jasmine karma-runner 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": "johndoe@test.net",
                    "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": "johndoe@test.net",
                "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

2 个答案:

答案 0 :(得分:3)

我的第一个想法是,当您实例化控制器时,某些事情正在发出请求。也许尝试在控制器声明行之后添加$ httpBackend.flush(),看看是否能解决它。另外,你的$ scope。$ digest应该在$ httpBackend.flush之后而不是之前吗?

答案 1 :(得分:1)

我发现它是什么。我的register_user()函数引用了$scope.user,它被设置为一个未定义的变量:userJohnDoeCredentials(我之前测试时使用的另一个变量名)。

不知道为什么我的IDE没有抱怨我引用一个未定义的变量,而且它正在通过我所有的jslint测试,所以这也很奇怪,但是嗯。它是固定的:D只有现在我才能得到模拟请求以返回我想要的东西......