如何对指令中定义的函数进行单元测试,如下面的myFunc
?
angular.module('myApp')
.directive('myDir', [function () {
var myFunc = function (arg) {
// code in here.
};
return {
restrict: 'A',
scope: { },
link: function (scope, element) {
}
};
}]);
或者如何定义我不希望在指令之外公开的可测试指令特定函数?
答案 0 :(得分:6)
最常见的方法是不测试私有方法,而是测试公开其行为的公共接口。这意味着您的单元测试将成为您的公共接口的合同。
您已声明您不希望在指令之外公开,但当然另一个选择是将此逻辑提取到某个服务myDirService
并在那里执行您的逻辑。在这种情况下,您将能够单独进行测试。
答案 1 :(得分:1)
正如@eddiec指出的那样,理想情况下我们不应该处于需要测试私人方法的情况,但我们不会生活在一个理想的世界中。
我发现工作方式是将所有私有变量放入私有对象 - 比如model
,然后使用getter函数访问它的任何属性。编译指令后,可以从任何茉莉花测试中访问范围。
angular.module('myApp').directive('myDir', [function() {
return {
restrict: 'A',
scope: {
},
link: function(scope, element) {
var model = {
myPrivateVar: 'myValue'
};
model.myPrivateFunction = function(arg) {
// work with arg
};
scope.getVal = function(prop, args) {
// Getter function to access any private variables
if (model.hasOwnProperty(prop)) {
// If the requested var exists, return it.
return args ? model[prop](args) : model[prop];
}
return null;
};
}
};
}]);
我对这个解决方案仍然不是很满意,但它现在有效。