加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 如何使用Jasmine监视控制器方法?

发布时间:2020-12-17 07:32:41 所属栏目:安全 来源:网络整理
导读:我正在使用“controller as”语法来创建我的控制器.我有一个私有初始化函数,它调用一个函数来加载默认数据. var app = angular.module('plunker',[]);app.controller('MainCtrl',function($scope) { var mc = this; mc.dataLoaded = false; function init()
我正在使用“controller as”语法来创建我的控制器.我有一个私有初始化函数,它调用一个函数来加载默认数据.
var app = angular.module('plunker',[]);

app.controller('MainCtrl',function($scope) {
  var mc = this;
  mc.dataLoaded = false;

  function init() {
    mc.loadData();
  }

  mc.loadData = function(){
    mc.dataLoaded = true;
  }

  init();
});

在我的测试中,我正在创建一个间谍来检查是否已经调用了loadData函数.虽然我可以通过测试mc.dataLoaded标志来验证函数是否被调用,但是我的间谍似乎没有记录被调用的函数.如何让间谍正确记录函数调用?

describe('Testing a Hello World controller',function() {
  var $scope = null;
  var ctrl = null;

  //you need to indicate your module in a test
  beforeEach(module('plunker'));

  beforeEach(inject(function($rootScope,$controller) {
    $scope = $rootScope.$new();

    ctrl = $controller('MainCtrl as mc',{
      $scope: $scope
    });

    spyOn($scope.mc,'loadData').and.callThrough();
  }));

  it('should call load data',function() {
    expect($scope.mc.loadData).toHaveBeenCalled();
  //expect($scope.mc.dataLoaded).toEqual(false);
  });
});

Plunker link

这一系列的线条:
ctrl = $controller('MainCtrl as mc',{
  $scope: $scope
});

spyOn($scope.mc,'loadData').and.callThrough();

意味着在控制器已经由$controller实例化之后创建了Jasmine间谍.在创建间谍之前,init函数已经执行.

你不能切换任何一条线,因为MainCtrl需要存在才能监视它上面的方法.

如果init函数调用另一个服务,则监视该服务的方法并声明该服务被正确调用.如果MainCtrl只是在内部执行某些操作,那么请测试其结果,例如,断言控制器的数据/属性已更新.如果它足够微不足道,它甚至可能不值得测试.

此外,由于您使用控制器作为语法,您可以通过调用$controller的返回值来引用控制器,而不是直接访问范围:

ctrl = $controller('MainCtrl as mc',{
  $scope: $scope
});

ctrl.loadData === $scope.mc.loadData; // true

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读