Javascript 在AngularJS中承诺控制器后,如何进行单元测试?
我有一个内部有回调的控制器:Javascript 在AngularJS中承诺控制器后,如何进行单元测试?,javascript,angularjs,unit-testing,jasmine,angular-mock,Javascript,Angularjs,Unit Testing,Jasmine,Angular Mock,我有一个内部有回调的控制器: angular.module('controllers').controller('headerController', headerController); function headerController(headerService) { var self = this; headerService.getHeaderContentData() .then(function(response) { s
angular.module('controllers').controller('headerController', headerController);
function headerController(headerService) {
var self = this;
headerService.getHeaderContentData()
.then(function(response) {
self.contentData = response.content;
});
}
我的问题是我需要在单元测试中检查contentData
的值。这个想法是当我调用expect(ctrl.contentData).to.be.defined
通过测试时,但是ctrl.contentData
的值是undeffined
。是否有方法测试此行为(在回调发生时测试self.contentData)
当前单元测试:
describe("controller", function() {
var controller, $httpBackend;
beforeEach(angular.mock.inject(function($injector, _$httpBackend_){
var $controller = $injector.get('$controller');
$httpBackend = _$httpBackend_;
var $scope = {};
$httpBackend.when('GET', '/data/header.content.json')
.respond(require('../../mock-data/header.content.json'));
var controller = $controller('headerController', { $scope: $scope });
$httpBackend.flush();
}));
it("should have contentData property populated", function() {
expect(controller.contentData).to.exist; // <- here fails: current value is undefined
});
});
描述(“控制器”,函数(){
var控制器,$httpBackend;
beforeach(angular.mock.inject(函数($injector,$httpBackend_u41;){
var$controller=$injector.get(“$controller”);
$httpBackend=\$httpBackend\;
var$scope={};
$httpBackend.when('GET','/data/header.content.json'))
.respond(要求('../../mock data/header.content.json');
var controller=$controller('headerController',{$scope:$scope});
$httpBackend.flush();
}));
它(“应该填充contentData属性”,函数(){
expect(controller.contentData).to.exist;//由于您的控制器未使用$hhtp
,因此没有理由在测试中处理它。测试headerController
的正确方法是模拟headerService
模拟服务:
beforeEach(module(function($provide) {
mockService = jasmine.createSpyObj('headerService', ['getHeaderContentData']);
$provide.value('headerService', mockService);
}));
beforeEach(inject(function($controller) {
ctrl = $controller('headerController');
}));
it('should change after promise resolved', inject(function($q, $rootScope) {
//create promise
deferred = $q.defer();
//mock service response (foc controller's constructor)
mockService.getHeaderContentData.and.returnValue(deferred.promise);
//call init()
ctrl.init();
expect(ctrl.contentData).toBeNull();
deferred.resolve('Hello World');
//not yet...
expect(ctrl.contentData).toBeNull();
//from angular $q dosumentation:
//"it's important to know that the resolution of promises is tied to the digest cycle"
$rootScope.$apply();
//now!
expect(ctrl.contentData).toBe('Hello World');
}));
现在,您需要模拟getHeaderContentData()
以返回承诺-使用$q
模拟服务方法:
beforeEach(module(function($provide) {
mockService = jasmine.createSpyObj('headerService', ['getHeaderContentData']);
$provide.value('headerService', mockService);
}));
beforeEach(inject(function($controller) {
ctrl = $controller('headerController');
}));
it('should change after promise resolved', inject(function($q, $rootScope) {
//create promise
deferred = $q.defer();
//mock service response (foc controller's constructor)
mockService.getHeaderContentData.and.returnValue(deferred.promise);
//call init()
ctrl.init();
expect(ctrl.contentData).toBeNull();
deferred.resolve('Hello World');
//not yet...
expect(ctrl.contentData).toBeNull();
//from angular $q dosumentation:
//"it's important to know that the resolution of promises is tied to the digest cycle"
$rootScope.$apply();
//now!
expect(ctrl.contentData).toBe('Hello World');
}));
请参见创建实例时会调用它。我应该修改控制器吗?angular.mock.module('controllers'))
也许您遗漏了这一行!@oscar.fimbres您可以完成上述所有操作,并使用同步承诺库来模拟承诺,使其更加简单。您可以返回同步承诺,而不是延迟。承诺
并在需要时解决它。解决完成后,您可以在syn中检查所有需要的内容没有侵入角度的消化循环的时间物质。看看图书馆