【发布时间】:2016-02-27 23:34:34
【问题描述】:
我创建了一个 Angular 自定义指令,其中包含一个名为 scriptingService 的服务。目标是使用 spyOn 模拟服务调用。这是测试的一部分:
beforeEach(inject(function ($rootScope, $compile,_scriptingService_) {
scope = $rootScope.$new();
scope.row = 1;
scriptingService = _scriptingService_;
Restangular = _Restangular_;
spyOn(Restangular, 'all').and.callThrough();
spyOn(scriptingService, 'getScript').and.callThrough();
element = angular.element('<ul id="rows" ui-list="row">');
$compile(element)(scope);
scope.$digest();
}));
这是指令代码:
.directive('uiList', [
function(scriptingService) {
return {
scope: {
lengthModel: '=uiList'
},
link: function(scope, elm, attrs) {
scope.$watch('lengthModel', function(newVal) {
scope.test=2;
console.log('kut');
scriptingService.getScript(request).then(function(scripts){
scope.scripts = scripts;
});
});
}
};
}
]);
但是我得到一个错误:
RestangularProvider <- Restangular <- scriptingService
如何模拟 scriptingService 并确保调用了该方法? Plunker ref:http://plnkr.co/edit/CDc7EV?p=preview
【问题讨论】:
-
您的 plunkr 有一些问题:旧 jasmin 版本与新语法相结合,and.callThrough() 在 1.3.1 中不起作用(更新 jasmin 或使用 andCallThrough())并且您的 scriptingService 不起作用t 存在于 plunkr 中。 plunkr 上的错误“Unknown Provider”是预期的,因为没有向模块注册此类服务。
-
我更新了 plunkr 并添加了 scriptService。我模拟了 Restangular 但仍然收到错误:错误:未知提供者:RestangularProvider
-
抱歉刚刚更新了链接:plnkr.co/edit/CDc7EV?p=preview
-
在我看来,提供的脚本不是一个好的单元测试,你是在测试指令编译吗?您需要模拟其他所有内容,包括restangular。您不需要
callThrough...您需要使用预期的数据来响应假...这是为了避免在您的服务出现错误时测试失败。
标签: angularjs angularjs-directive karma-jasmine spy