在Jasmine测试中模拟Angularjs ng-init函数

时间:2014-01-10 12:00:31

标签: angularjs jasmine angular-mock

当我在角度测试中实例化控制器时,我想将此函数注入ng-init指令,在html中我会将其设置为:

 <div ng-controller="my-ctrl" ng-init="initialize({updateUrl: 'list_json'})

在我的测试中,我可以编写一个这样的函数,它会在范围内粘贴正确的东西,但我觉得它很混乱。另外,我担心html中的功能目前在我的中途测试中搞乱了。

function initController($scope){

  $scope['updateUrl'] = 'list_json'

}

1 个答案:

答案 0 :(得分:4)

我不认为ng-init本身会创建任何函数,所以我认为这只是一种错误的使用方式(由你的片段判断)。

我通常做的是自己创建init函数,然后在控制器的单元测试中没有问题地进行测试。

<div ng-controller="my-ctrl" ng-init="init({ updateUrl : 'list_json' })">...</div>

function MyController($scope){

  $scope.init = function(config) {
     $scope.updateUrl = config.updateUrl;
  }

}

然后在Jasmine中你可以毫无问题地编写一个可以调用init()函数的测试(跳过样板文件):

// Given
var config = { updateUrl : 'list_json' };
// When
myController.init(config);
// Then
// ...

有关单元测试的重要评论

如果您认为您应该测试HTML标记是否使用给定参数调用init(),那么我认为您错了。没有什么可以测试的。根本就没有逻辑!你的测试应该验证组件是如何工作的,如果程序员将错误的参数从HTML传递给Angular会出错,那么你就不应该在单元测试中覆盖这样的错误。你不能强迫人们不犯错误: - )