AngularJS:我如何在单元测试的控制器中添加一个函数?

迈斯特

我有一个控制器,当前在加载相关视图时正在调用RESTful API。因此,我不确定这个问题是否与我的测试方式或代码本身的实现有关-我会对所有从整体上解决该问题的建议感到满意,例如,请帮助我-测试代码可以满足我的要求:)

以下是一些样本来说明我的观点:

控制器:

angular.module('app.myModule',[])
.controller('MyController', function($scope) {

  $scope.notTestingThis = function() {
    var thisFails = $scope.do.not.want.to.mock.these.objects.substr(0,10);
  };

  $scope.testingThis = function(myString) {
    $scope.newString = myString;
  };

  $scope.notTestingThis();

});

测试(按现状):

describe('MyControllerTest', function() {

  beforeEach(module('app.myModule'));

  var $controller;

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

  describe('$scope.testingThis()', function() {

    it('sets newString', function() {
      $scope = {
        'notTestingThis': {}
      };
      var myController = $controller('MyController', {$scope: $scope});
    });

  });

});

加载此视图时,我需要以某种方式调用notTestingThis函数,但是在我的单元测试中,我想隔离testingThis函数。问题是,当我在测试中初始化控制器时,它当然会调用notTestingThis并尝试对不存在的对象(在此测试中我并不关心的对象)执行操作。

显然,按照该示例尝试存入有问题的函数没有用,因为初始化时会重写$ scope。有没有办法在您要测试的控制器中存根或模拟单个功能,或者我错过了某个地方的要点?一位同事提出的一些建议是:

增强控制器以了解单元测试本身,使您可以基于注入的模拟来调整程序流,即控制器中的以下内容:

if (!$scope.methodA) {
   $scope.methodA = function() {...}
}

... 或者 ...

改变的方式notTestingThis函数被调用,通过听从$ rootScope初始化事件,而不是直接调用它,这让我嘲笑$ rootScope所以它不会触发该事件,从而防止notTestingThis被称为

我不禁觉得自己好像在想错了。有什么见解吗?

迈斯特

只是加倍查询,以防其他查询出现。我仔细研究了这两项建议,在实施时都与我的原始评论有所不同(因为我对这些建议有误解),即:

选项1

而不是包装每个函数,而是将调用代码包装在:

if(!testingBoolean) { $scope.notTestingThis(); };

使用testingBoolean为false,除非作为(可选)参数传递给Controller,从而允许测试代码阻止调用

选项2:

使用服务功能从$ rootScope进行$ broadcast。在该事件上将调用代码包装在侦听器中,然后从控制器调用该函数。在执行测试时模拟$ rootScope将阻止notTestingThis函数被触发。

真正的解决方案

但是,这些方法似乎分散了注意力。尽管未在任何地方明确声明,但看来控制器不应该自己调用函数。正确的选择似乎是重新设计应用程序设计,以便指令可以通过绑定调用函数,从而简化了单元测试。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在AngularJS中,如何在一个控制器中创建函数以更改另一个控制器中的变量?

来自分类Dev

AngularJS中的控制器中的单元测试承诺

来自分类Dev

控制器angularjs的单元测试

来自分类Dev

单元测试angularjs控制器

来自分类Dev

AngularJS中的单元测试指令控制器

来自分类Dev

angularJS中的单元测试控制器

来自分类Dev

AngularJS中的单元测试指令控制器

来自分类Dev

如何对一个全局函数(即angularJs中的$ rootScope.functionname)进行单元测试

来自分类Dev

对通过 Startup 类调用另一个控制器的控制器进行单元测试

来自分类Dev

AngularJS控制器:如何在另一个控制器中调用一个控制器?

来自分类Dev

AngularJS控制器:如何在另一个控制器中调用一个控制器?

来自分类Dev

如何在Mocha中编写Sails.js控制器的单元测试

来自分类Dev

如何在角度单元测试中从指令而不是控制器模拟作用域

来自分类Dev

如何在Ember.js单元测试中为控制器设置模型数据

来自分类Dev

如何在Laravel中编写控制器的单元测试?

来自分类Dev

如何在Cordapp中对服务和控制器(kotlin)进行单元测试?

来自分类Dev

如何在Play Framework 2 Scala中对控制器进行单元测试

来自分类Dev

如何在 PHP 中调用另一个控制器文件中的函数?

来自分类Dev

如何在AngularJS中与另一个控制器共享$ scope变量?

来自分类Dev

如何在angularJS中为一个视图定义多个控制器?

来自分类Dev

AngularJS:如何在另一个控制器中执行方法?

来自分类Dev

从另一个控制器中调用一个控制器内部的函数-AngularJS

来自分类Dev

如何在同一程序包中为控制器类添加单元和集成测试类

来自分类Dev

如何对控制器中的函数进行单元测试(使用Jasmine),该函数调用工厂服务并返回承诺

来自分类Dev

角度单元测试:调用另一个控制器中定义的方法会抛出“未定义”不是错误

来自分类Dev

如何在ASP MVC设置中将AngularJS中的变量从一个控制器传递到另一个控制器?

来自分类Dev

如何在ASP MVC设置中将AngularJS中的变量从一个控制器传递到另一个控制器?

来自分类Dev

如何在 AngularJs 1.7.x 中从一个控制器调用方法到另一个控制器,以刷新 UI 数据

来自分类Dev

使用Jasmine进行AngularJS控制器单元测试

Related 相关文章

  1. 1

    在AngularJS中,如何在一个控制器中创建函数以更改另一个控制器中的变量?

  2. 2

    AngularJS中的控制器中的单元测试承诺

  3. 3

    控制器angularjs的单元测试

  4. 4

    单元测试angularjs控制器

  5. 5

    AngularJS中的单元测试指令控制器

  6. 6

    angularJS中的单元测试控制器

  7. 7

    AngularJS中的单元测试指令控制器

  8. 8

    如何对一个全局函数(即angularJs中的$ rootScope.functionname)进行单元测试

  9. 9

    对通过 Startup 类调用另一个控制器的控制器进行单元测试

  10. 10

    AngularJS控制器:如何在另一个控制器中调用一个控制器?

  11. 11

    AngularJS控制器:如何在另一个控制器中调用一个控制器?

  12. 12

    如何在Mocha中编写Sails.js控制器的单元测试

  13. 13

    如何在角度单元测试中从指令而不是控制器模拟作用域

  14. 14

    如何在Ember.js单元测试中为控制器设置模型数据

  15. 15

    如何在Laravel中编写控制器的单元测试?

  16. 16

    如何在Cordapp中对服务和控制器(kotlin)进行单元测试?

  17. 17

    如何在Play Framework 2 Scala中对控制器进行单元测试

  18. 18

    如何在 PHP 中调用另一个控制器文件中的函数?

  19. 19

    如何在AngularJS中与另一个控制器共享$ scope变量?

  20. 20

    如何在angularJS中为一个视图定义多个控制器?

  21. 21

    AngularJS:如何在另一个控制器中执行方法?

  22. 22

    从另一个控制器中调用一个控制器内部的函数-AngularJS

  23. 23

    如何在同一程序包中为控制器类添加单元和集成测试类

  24. 24

    如何对控制器中的函数进行单元测试(使用Jasmine),该函数调用工厂服务并返回承诺

  25. 25

    角度单元测试:调用另一个控制器中定义的方法会抛出“未定义”不是错误

  26. 26

    如何在ASP MVC设置中将AngularJS中的变量从一个控制器传递到另一个控制器?

  27. 27

    如何在ASP MVC设置中将AngularJS中的变量从一个控制器传递到另一个控制器?

  28. 28

    如何在 AngularJs 1.7.x 中从一个控制器调用方法到另一个控制器,以刷新 UI 数据

  29. 29

    使用Jasmine进行AngularJS控制器单元测试

热门标签

归档