Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.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_Promise - Fatal编程技术网

Javascript 在angularjs控制器中对承诺调用进行单元测试时遇到问题

Javascript 在angularjs控制器中对承诺调用进行单元测试时遇到问题,javascript,angularjs,unit-testing,jasmine,promise,Javascript,Angularjs,Unit Testing,Jasmine,Promise,SupportedLanguagesServicesget方法返回一个promise,在控制器中解析如下: angular.module('App').controller('MyController', ['SupportedLanguagesService', function(SupportedLanguagesService) { var self = this; self.supportedLanguages = [];

SupportedLanguagesServices
get方法返回一个
promise
,在控制器中解析如下:

    angular.module('App').controller('MyController', ['SupportedLanguagesService',
    function(SupportedLanguagesService) {

        var self = this;
        self.supportedLanguages = [];

        SupportedLanguagesService.get().success(
            function(response) {
                self.supportedLanguages = response;
        });

    }]);
这是我写的测试,但它不起作用:

    describe('Controller: MyController', function() {

    beforeEach(module('App'));

    var rootScope, controller;

    beforeEach(inject(function($controller, $rootScope, SupportedLanguagesService, $q) {

        var deferred = $q.defer();
        deferred.resolve([{name:"English", code:"en"},{name:"Portugues", code:"pt_BR"]);
        spyOn(SupportedLanguagesService, 'get').andReturn(deferred.promise);

        rootScope = $rootScope;
        controller = $controller;
    }));

    it('should get SupportedLanguages', function() {
        rootScope.$digest();
        var ctrl = controller('MyController');
        expect(ctrl.supportedLanguages.length).toEqual(2);
    });

});
它在语句上引发异常:
var ctrl=controller('MyController')


感谢您的帮助。

成功
(这是一个
$http
回调)之前,您可以更改为
然后
,这在所有承诺中都可用。这将允许您轻松地模仿承诺(而不必担心
$httpBackend
):

    SupportedLanguagesService.get().then(
        function(response) {
            self.supportedLanguages = response.data;
    });
然后,您需要使用控制器的构造函数,然后调用
$digest

it('should get SupportedLanguages', function() {

    var ctrl = controller('MyController');
    rootScope.$digest();
    expect(ctrl.supportedLanguages.length).toEqual(2);
});
您还可以使用
$q简化设置代码

var response = [{name:"English", code:"en"},{name:"Portugues", code:"pt_BR"}];
spyOn(SupportedLanguagesService, 'get').andReturn($q.when(response));

看起来您在
代码“pt\u BR”之后缺少了一个
}
大括号
.True。输入问题时,缺少的}是一个输入错误。仍在处理问题
SupportedLanguageService
正在使用
$http
,您应该使用
$httpBackend
来模拟http调用。这仍然不起作用,因为OP正在使用http承诺链接。$q没有成功的方法,它只有ENmethod@PSL你是说
$q.when
部分吗?我明白了…我认为OP需要
$httpBackend
来代替。$q.when和deferred.promise。实际上,uniot测试控制器应该模拟服务,这样就可以了,但OP应该使用
要使用$q.when或deferred.promise,我相信给出的答案非常有效。首先,我需要使用“then”而不是“success”来解决控制器中的承诺问题,然后我必须在初始化控制器后调用$digest(),而不是之前。谢谢David