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