Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在AngularJS中承诺控制器后,如何进行单元测试?_Javascript_Angularjs_Unit Testing_Jasmine_Angular Mock - Fatal编程技术网

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中检查所有需要的内容没有侵入角度的消化循环的时间物质。看看图书馆