$ scope属性在测试浏览器中更新,但不在测试中更新

时间:2017-05-08 21:09:57

标签: javascript angularjs jasmine karma-jasmine

测试文件:

describe('$rootScope', function() {
    describe('$on', function() {
        var credentials = "Basic abcd1234";
        var $scope;
        var $rootScope;
        var $httpBackend;
        ...
        beforeEach(inject(function($injector, $controller, _$rootScope_, $state, _$q_, currentUserService) {
            $scope = _$rootScope_.$new();
            $rootScope = _$rootScope_;
            $httpBackend.when('GET', 'dist/app/login/login.html').respond({'title': 'TEST_TITLE'}, {'A-Token': 'xxx'});
        }));

        ...
        it('should set $scope.title if noAuthorization', function() {
            spyOn($rootScope, '$on');
            $controller('AppCtrl', {$scope: $scope});
            $rootScope.$broadcast("$stateChangeStart");
            $rootScope.$apply();

            expect($rootScope.$on).toHaveBeenCalled();
            expect($scope.title).toBe('TEST_TITLE');

        });
    });
});

$ scope.title在我的测试中总是未定义的。期望总是失败。我尝试过$ emit,$ apply等。这是在一个$ rootScope.on方法内的控制器内。

但是如果我在js文件中控制log $ scope.title,它确实显示$ scope.title已经更新了。

我还应该提到被调用的函数不在$ scope中,即它不是$scope.updateTitle,它只是function updateTitle(...)

我不觉得实际的代码是必要的,因为它确实是它的工作。我只是想知道为什么测试中的$ scope没有得到更新。

1 个答案:

答案 0 :(得分:-1)

简而言之:不要忘记间谍.andCallThrough()。茉莉花间谍需要andCallThrough()。使用element.scope()访问正确的范围。

spyOn(scope, '$apply').andCallThrough();