gpt4 book ai didi

javascript - 使用 Jasmine 测试 Angular Controller 中的非作用域函数

转载 作者:数据小太阳 更新时间:2023-10-29 06:11:03 24 4
gpt4 key购买 nike

Jasmine 是使用最广泛的测试框架之一,以 BDD 方式对 javascript 代码进行单元测试。我试图将它用于 AngularJS 组件测试。 AngularJS 文档提供了以下示例代码

describe('PasswordController', function() {
beforeEach(module('app'));
var $controller;

beforeEach(inject(function(_$controller_){
$controller = _$controller_;
}));

describe('$scope.grade', function() {
it('sets the strength to "strong" if the password length is >8 chars', function() {
var $scope = {};
var controller = $controller('PasswordController', { $scope: $scope });
$scope.password = 'longerthaneightchars';
$scope.grade();
expect($scope.strength).toEqual('strong');
});
});
});

所以上面的代码使用了 Angular 模拟库,并通过依赖注入(inject)通过 Controller 处理范围。现在我有一个范围对象,其中包含我的 Controller 分配给它的功能和对象。我可以很好地测试它。快乐。

现在有趣的部分是如果我想测试未链接到范围的函数。例如,下面的 doSomethingVeryCoolThatNeedsTesting 函数

angular.module('app', [])
.controller('PasswordController', function PasswordController($scope) {
$scope.password = '';
$scope.grade = function() {
var size = $scope.password.length;
if (size > 8) {
$scope.strength = 'strong';
} else if (size > 3) {
$scope.strength = 'medium';
} else {
$scope.strength = 'weak';
}

function doSomethingVeryCoolThatNeedsTesting() {
....
}

};
});

似乎每当我使用 $controller('PasswordController', { $scope: $scope }); 它返回一个填充的 $scope 对象和 未定义 Controller 对象。

长话短说

有没有一种方法可以测试未链接到作用域的 Angular Controller 函数?

最佳答案

没有。只要您不向外界公开内部 Controller 功能,这些功能就是私有(private)的,请参阅 revealing module pattern .

所以问题既不是 Angular 也不是测试框架,问题是javascript语言本身。

如果你想测试一个内部函数,你必须让它对外部可见。选项是:

  1. 在 $scope 对象上公开它
  2. 公开到任何其他强烈反对且测试可能无法访问的全局对象

关于javascript - 使用 Jasmine 测试 Angular Controller 中的非作用域函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31158515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com