微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

angularjs – $httpBackend.flush()仍然需要超时来定义对象

我正在使用Karma对我的AngularJS应用程序进行单元测试,并使用$HttpBackend对后端进行存根.不知何故,flush()方法似乎没有解决我的所有请求,因为控制器中的某些变量仍然未定义.但是,如果我在解决我的期望之前添加超时,它工作正常!

我的控制器:

FeedbackApp.controller('CompetenceCtrl',[ '$scope','$location','Restangular',function CompetenceCtrl($scope,$location,Restangular) {

        $scope.compId = null;
        $scope.index = null;

        Restangular.one('questionnaires',1).get().then(function (q) {
            $scope.questionnaire = q;

            angular.forEach($scope.questionnaire.competences,function (value,key) {
                var compTemp = new models.Competence(value);
                if (!compTemp.finished() && $scope.compId === null) {
                    $scope.compId = compTemp.id;
                    $scope.index = key;
                }
            });
            getCompetence($scope.compId);

        });

        function getCompetence(compId) {
            Restangular.one('questionnaires',1).one('competences',compId).get().then(function (c) {
                $scope.competence = c;
            });
        }
    }]);

我的规格:

'use strict';

describe('Controller: CompetenceCtrl',function () {
    //load the controller's module
    beforeEach(module('360FeedbackApp','mockQuestionnaire','mockCompetences'));

    var $httpBackend,$scope,createController;

    beforeEach(inject(function ($injector,_Restangular_,defaultQuestionnaire,defaultCompetences) {
        // Set up the mock http service responses
        $httpBackend = $injector.get('$httpBackend');
        // backend deFinition common for all tests
        $httpBackend.whenGET(apiUrl + '/questionnaires/1').respond(defaultQuestionnaire);

        $httpBackend.whenGET(apiUrl + '/questionnaires/1/competences/1').respond(defaultCompetences.competences[0]);
        $httpBackend.whenGET(apiUrl + '/questionnaires/1/competences/2').respond(defaultCompetences.competences[1]);
        $httpBackend.whenGET(apiUrl + '/questionnaires/1/competences/3').respond(defaultCompetences.competences[2]);
        $httpBackend.whenGET(apiUrl + '/questionnaires/1/competences/4').respond(defaultCompetences.competences[3]);
        $httpBackend.whenGET(apiUrl + '/questionnaires/1/competences/5').respond(defaultCompetences.competences[4]);

        $httpBackend.whenPUT(apiUrl + '/questionnaires/1/competences/1').respond(200);
        $httpBackend.whenPUT(apiUrl + '/questionnaires/1/competences/2').respond(200);
        $httpBackend.whenPUT(apiUrl + '/questionnaires/1/competences/3').respond(200);
        $httpBackend.whenPUT(apiUrl + '/questionnaires/1/competences/4').respond(200);
        $httpBackend.whenPUT(apiUrl + '/questionnaires/1/competences/5').respond(200);

        // Get hold of a scope (i.e. the root scope)
        $scope = $injector.get('$rootScope');
        // and the location
        $location = $injector.get('$location');
        // The $controller service is used to create instances of controllers
        var $controller = $injector.get('$controller');

        createController = function () {
            return $controller('CompetenceCtrl',{'$scope': $scope,'$location': $location,'Restangular': _Restangular_ });
        };
    }));

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

    it('should set the first competence',function () {
        $httpBackend.expectGET(apiUrl + '/questionnaires/1/competences/1');
        createController();
        $httpBackend.flush();
        //DO NOT UNDERSTAND WHY I NEED THIS TIMEOUT! 
        //THE TEST FAILS WITH 'undefined' IF I DONT USE IT!
        setTimeout(function() {
        expect($scope.competence).tobedefined();
        },5000);
    });

任何帮助是极大的赞赏!

解决方法

当你有需要解决的promise(由Restangular调用上的.then()指示)时,你需要在$httpBackend.flush()之后调用$scope.$digest()来解决它们.这听起来也许你的Restangular调用正在击中实际的服务器而不是模拟,这将导致你需要超时.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐