测试 – 如何用AngularJs中的私有方法编写可测试的控制器?

前端之家收集整理的这篇文章主要介绍了测试 – 如何用AngularJs中的私有方法编写可测试的控制器?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
好的,所以我一直在绊倒一些问题很长时间,我想听听社会其他人的意见。

首先,让我们来看一些抽象控制器。

function Ctrl($scope,anyService) {

   $scope.field = "field";
   $scope.whenClicked = function() {
      util();
   };

   function util() {
      anyService.doSmth();
   }

}

显然我们在这里:

>控制器的常规支架与$范围和一些服务注入
>一些字段和函数附加到作用域
> private方法util()

现在,我想在单元测试(Jasmine)中覆盖这个类。然而,问题是,我想验证当我点击(调用whenClicked())一些项目,util()方法将被调用。我不知道该怎么做,因为在Jasmine测试中,我总是得到的错误,或者mock为util()没有被定义或没有被调用

注意:我不是试图修复这个特殊的例子,我问一般测试这样的代码模式。所以请不要告诉我“什么是确切的错误”。我问如何做到这一点,而不是如何解决这个问题。

我一直在尝试一些方法围绕这个:

>显然我不能在我的单元测试中使用$ scope,因为我没有这个功能附加到这个对象(它通常以消息预期间谍结束,但未定义或类似)
>我尝试通过Ctrl.util = util将这些函数附加到控制器对象;然后验证mock像Ctrl.util = jasmine.createSpy(),但在这种情况下,Ctrl.util不被调用,因此测试失败
>我试图改变util()附加到这个对象,并再次嘲笑Ctrl.util,没有运气

好吧,我找不到我的方式,我会期待一些帮助从JS忍者,一个工作的小提琴将是完美的。

命名空间的范围是污染。你想要做的是将该逻辑提取到一个单独的函数,然后注入到你的控制器。即:
function Ctrl($scope,util) {

   $scope.field = "field";
   $scope.whenClicked = function() {
      util();
   };
}

angular.module("foo",[])
       .service("anyService",function(...){...})
       .factory("util",function(anyService) {
              return function() {
                     anyService.doSmth();
              };
       });

现在你可以单元测试嘲笑你的Ctrl以及“util”。

猜你在找的Angularjs相关文章