gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:17:20 27 4
gpt4 key购买 nike

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

我的 Controller :

    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,
$location,
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 调用正在访问实际服务器而不是模拟,这将导致您需要超时。

关于angularjs - $httpBackend.flush() 仍然需要超时来定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19023963/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com