TypeError:无法读取属性'那么'在使用Karma测试AngularJS控制器时未定义的
TypeError: Cannot read property 'then' of undefined in testing AngularJS controller with Karma
我正试图为一个得到服务承诺的控制器编写单元测试,但在Jasmine中我得到了:
TypeError: Cannot read property 'then' of undefined
在控制器中,我根据服务返回的承诺调用.then()
。
有人能帮忙吗?我肯定错过了一些显而易见的东西。
这是一个砰的一声:http://plnkr.co/edit/vJOopys7pWTrTQ2vLgXS?p=preview
'use strict';
describe('Language controller', function() {
var scope, translationService, createController;
beforeEach(function() {
var mockTranslationService = {};
module('dictApp', function($provide) {
$provide.value('translationService', mockTranslationService);
});
inject(function($q) {
mockTranslationService.languages = [
{
name: 'slovak'
},
{
name: 'czech'
}
];
mockTranslationService.languagesWithWords = [{
name: 'slovak',
words: [{
key: 'Car',
translation: 'Auto',
createdOn: 0
}, {
key: 'Flower',
translation: 'Kvet',
createdOn: 0
}]
}, {
name: 'czech',
words: {
key: 'Plaza',
translation: 'Namesti',
createdOn: 0
}
}];
mockTranslationService.getLanguages = function() {
var deferred = $q.defer();
deferred.resolve(this.languages);
return deferred.promise;
};
});
});
beforeEach(inject(function($controller, $rootScope, _translationService_) {
scope = $rootScope.$new();
translationService = _translationService_;
createController = function () {
return $controller('LanguageCtrl',
{$scope: scope, translationService: translationService});
};
scope.$digest();
}));
it('should get the language array', function() {
spyOn(translationService, 'getLanguages');
createController();
expect(translationService.getLanguages).toHaveBeenCalled();
});
});
这就是控制器:
dictControllers.controller('LanguageCtrl', ['$scope', 'translationService', function($scope, translationService){
$scope.getLanguages = function() {
translationService.getLanguages().then(function(){
$scope.languages = translationService.languages;
});
};
$scope.getLanguages();
$scope.getWords = function(language) {
translationService.getWords(language);
};
$scope.newWord = {};
$scope.addWord = function(language) {
translationService.addWord($scope.newWord, language);
$scope.newWord = {};
};
}]);
请改用spyOn(mockTranslationService, 'getLanguages').and.returnValue(deferred.promise);
。在调用getLocations()之后而不是在getLocations()
返回promise之前解析promise也更有意义。您还应该检查语言。
inject(function($q) {
deferred = $q.defer();
mockTranslationService.languages = [
{
name: 'slovak'
},
{
name: 'czech'
}
];
mockTranslationService.languagesWithWords = [{
name: 'slovak',
words: [{
key: 'Car',
translation: 'Auto',
createdOn: 0
}, {
key: 'Flower',
translation: 'Kvet',
createdOn: 0
}]
}, {
name: 'czech',
words: {
key: 'Plaza',
translation: 'Namesti',
createdOn: 0
}
}];
mockTranslationService.getLanguages = function () {
};
spyOn(mockTranslationService, 'getLanguages').and.returnValue(deferred.promise);
});
it('should get the language array', function() {
createController();
deferred.resolve();
scope.$digest();
expect(translationService.getLanguages).toHaveBeenCalled();
expect(scope.languages).toEqual(translationService.languages);
});
Plunkr
相关文章:
- 如何使用KARMA对React JSX ES6代码进行单元测试
- 在禁用浏览器flash插件的情况下运行Karma测试
- 在Karma Jasmine单元测试用例中检查日期格式
- 如何使用gulp-test和karma在浏览器中调试Javascript测试文件
- 编写Karma+Mocha测试,同时使用依赖注入和“完成”
- 使用谷歌地图模块依赖性运行Karma测试
- 如何使用Karma单元测试运行程序捕获console.error
- 使用karma浏览器对AngularJS应用程序进行单元测试
- CSS选择器在Angular单元测试w/karma&柴
- 在Karma+Jasmine测试中读取HTML文件
- TypeError:无法读取属性'那么'在使用Karma测试AngularJS控制器时未定义的
- AngularJs的单元测试失败是因为Karma没有'无法识别$scope$控制器中的侦听器
- 手动触发 Karma 以重新运行测试
- 从 Karma 和 Jasmine 测试调用控制器函数
- 如何在 Karma 中配置 System.js 以测试取决于时刻.js的代码
- 如何使用 Karma、Jasmine 和 Istanbul 指定测试应涵盖哪些函数/方法
- 设置 Jasmine & Karma 来测试 Angular
- 单元测试 Karma Jasmine 语法错误:在“&”角度指令绑定上解析错误
- JavaScript单元测试:Karma、jasmine和bootstrap测试的依赖项
- Angular 2用webpack测试karma时,无法找到变量:Map