AngularJS - 带标头响应的单元测试

时间:2015-08-19 17:28:35

标签: angularjs unit-testing karma-jasmine

当用户在我的网站上成功登录时,我的后端会检索'x-token'。在我的前端,我做了一个简单的验证,得到这个令牌并设置:$rootScope.authenticated = true;如果令牌不存在于我的前端设置的标题响应中:$rootScope.authenticated = false;

我的控制器

signinService
    .signin(datafromForm)
    .then(function (data) {
        if ( $myTokenManager.save(data.headers('x-token')) ) {
            $rootScope.authenticated = true;
        } else {
            $rootScope.authenticated = false;
            // Unit test is sent it here :(
        }

    });

这是完美的,现在我需要对此方法进行单元测试,但我的测试没有正确生成或设置标头响应。我在测试中做错了什么?

describe('Testing controllers', function() {

    describe('MyController unit test', function() {

        var $httpBackend, $rootScope, createController, authRequestHandler, datafromForm;

        beforeEach(module('myapp'));

        beforeEach(inject(function($injector) {

            $httpBackend = $injector.get('$httpBackend');

            authRequestHandler = $httpBackend
                                    .when(
                                        'POST',
                                        'http://mywebapp:8080/loginuser',
                                        {"username":"admin", "password":"admin"}
                                    ).respond({'x-token': 'XXX'});

            $rootScope = $injector.get('$rootScope');
            var $controller = $injector.get('$controller');

            createController = function() {
                return $controller('MyController', {'$scope' : $rootScope});
            }
        }));

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

        //
        it('should authentication user', function() {

            var controller = createController();

            //
            $rootScope.username = "admin";
            $rootScope.password = "admin";

            datafromForm = {
                username: $rootScope.username,
                password: $rootScope.password
            };

            $httpBackend.expectPOST(
                'http://mywebapp:8080/loginuser',
                {"username":"admin", "password":"admin"}
            ).respond(
                200, 
                {'x-token': 'XXX'}
            );

            $rootScope.login(formData);
            $httpBackend.flush();
            expect($rootScope.authenticated).toBe(true); // This is getting false :(
        });





    });

});

我关注角度文档的this示例。

1 个答案:

答案 0 :(得分:1)

respond()函数的文档签名是

function([status,] data[, headers, statusText])

在您的第一个respond()中,您只传递数据,而不是标题:

respond({'x-token': 'XXX'});    

在您的第二个respond()中,您只传递状态和数据,但仍然没有标题:

respond(
    200, 
    {'x-token': 'XXX'}
);