单元测试AngularJS与$ httpBackend给人"错误:意外的请求" [英] Unit testing AngularJS with $httpBackend gives "Error: Unexpected Request"

查看:174
本文介绍了单元测试AngularJS与$ httpBackend给人"错误:意外的请求"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要preface这个问题,说我已经得到了一个测试,我的LoginCtrl,它的性能几乎完全一样的任务工作。我相信这是真的小,我忽略了一些问题。在此先感谢您的帮助:)

我已经设置为 httpBackend 为我的测试预期值/响应,但是当我运行 httpBackend.flush(),就好像我从来没有设定预期。

测试code:

 描述(用户注册,函数(){
    VAR范围,RegisterCtrl,httpBackend,userJohnDoe,userJohnDoeRegistered,Restangular;
    //测试
    beforeEach(模块('LR.User.Register'));
    描述(RegisterCtrl',函数(){
        beforeEach(注(函数($控制器,_ $ httpBackend_,$ rootScope,_Restangular_,$州){
            范围= $ rootScope $新的()。
            httpBackend = _ $ httpBackend_;
            Restangular = _Restangular_;            // 楷模
            userJohnDoeRegistered = {
                ACCESS_TOKEN:YzEyZDhjNjBlY2EwMTMxMmQzZGIzYWY5NDY4OGYwM​​jMzMGVjNDU3MDVhY2U0YjJmNDc1ODI3NWU0ODkzZGNkMQ,
                expires_in:7200,
                token_type:旗手,
                范围:空,
                refresh_token:MmFhMTQ5NzU4ODI5ZjE2Mjk3ZjNlYzEwYzJkMjc4M2NkZjY2MjVkMjIwNWQzODUxYWNiYzY3NzIyMzEwYzJhNg,
                用户:{
                    用户名:人johndoe
                    电子邮件:johndoe@test.net
                    标识:1,
                    FIRST_NAME:约翰,
                    middle_name:F,
                    姓氏:李四,
                    创造:2013-09-04T10:46:10-0500
                    更新:2013-09-04T10:46:10-0500
                },
                状态:成功,
                状态_ code:200,
                STATUS_TEXT:OK
            };
            userJohnDoe = {
                电子邮件:johndoe@test.net
                FIRST_NAME:约翰,
                middle_name:F,
                姓氏:李四,
                密码:'test123X',
                passwordSecond:test123X',
                CLIENT_ID:1_3b5zgimwg4kkko4wksk4sw0o48040o8ws8og8kg4wsowwkc44s
            };            httpBackend.whenPOST('/注册,userJohnDoe).respond(userJohnDoeRegistered);
            RegisterCtrl = $控制器('RegisterCtrl',{$适用范围:适用范围,$状态:$状态,Restangular:Restangular});
        }));
        afterEach(函数(){
            httpBackend.verifyNoOutstandingExpectation();
            httpBackend.verifyNoOutstandingRequest();
        });
        它('应该可以注册一个假用户,注入(函数(){
            VAR resolvedRegistration;
            变种CB =功能(响应){
                //预期userJohnDoe对象
                resolvedRegistration = sanitizeRestangularOne(响应);                的console.log(logTestHeader('注册响应')+
                    JSON.stringify(resolvedRegistration,空,''));
            };            //设置凭据
            scope.user = userJohnDoeCredentials;            //调用登录
            VAR寄存器= scope.register_user()。然后(函数(){
                CB();
            });
            范围$摘要()。
            httpBackend.flush();
            期待(resolvedRegistration).toEqual(userJohnDoeRegistered);
        }));
    });
});

输出响应:

 铬29.0.1547(Mac OS X的10.8.4)用户注册RegisterCtrl应该能够注册失败虚假用户
    错误:意外的请求:POST /寄存器
    没有更多的要求预期
        在错误(小于匿名>)
        在$ httpBackend (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular-mocks/angular-mocks.js:959:9)
        在Y(/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:64:282)
        在克(/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:62:272)
        在r(/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:96:140)
        在r(/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:96:140)
        在/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:97:293
        在Object.g。$的eval(/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:104:502)
        在Object.g。$摘要(/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular/angular.min.js:102:419)
        在空<&匿名GT; (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/src/app/user/register/register.spec.js:74:19)
    错误:申报地点
        在window.jasmine.window.inject.angular.mock.inject (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/vendor/angular-mocks/angular-mocks.js:1781:25)
        在空<&匿名GT; (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/src/app/user/register/register.spec.js:57:54)
        在空<&匿名GT; (/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/src/app/user/register/register.spec.js:9:5)
        在/Users/bobothefrofro/Development/lr-phoenix/phoenix-client/src/app/user/register/register.spec.js:1:1


解决方案

我发现那是什么。我的 register_user()函数引用 $ scope.user ,这是被设置为一个未定义的变量: userJohnDoeCredentials (我用我的previous测试不同的变量名)。

不知道为什么我的IDE不是抱怨我引用一个未定义的变量,它被路过我的所有的JSLint测试,所以这是奇怪了,但是咩。这是固定的:D只有现在我能得到模拟请求返回我想要什么它...

I'm gonna preface this question by saying I've already gotten a test to work for my "LoginCtrl" which performs almost the exact same task. I'm sure this is an issue of something really small I've overlooked. Thanks in advance for any help :)

I've set the expected value/response for httpBackend for my test, but when I run httpBackend.flush(), it's as if I never set the expectation.

Testing code:

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


});

Output response:

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

解决方案

I found out what it was. my register_user() function was referencing $scope.user, which was being set to an undefined variable: userJohnDoeCredentials (a different variable name I had used for my previous test).

Not sure why my IDE wasn't complaining about me referencing an undefined variable, and it was passing all of my jslint tests, so that's strange too, but meh. It's fixed :D Only if now I could get the mock request to return what I want it to...

这篇关于单元测试AngularJS与$ httpBackend给人&QUOT;错误:意外的请求&QUOT;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆