sinon一个控制器上存在的间谍功能(这个)

时间:2016-03-28 18:51:16

标签: angularjs unit-testing

我有一个棘手的功能,我想监视。

 var GlobalAlertsController = function() {
 }

这是指角度控制器

 var GlobalAlertsController = function() {
      this.updateHeight = function (clientHeight) {
    $rootScope.AlertsGlobal.clientHeight = clientHeight;
 }
像这样......

require: 'MainGlobalAlerts',

该函数存在于指令控制器内,并且是另一个控制器所需要的(单元测试需要不同吗?)。

html = angular.element("<my-directive> </my-directive")
element = $compile(html)($rootScope)
$rootScope.$digest(element)
scope = element.scope()    // note html and scope are defined below describe

在我的单元测试中,我嘲笑了我的指令

sinon.spy(scope, 'updateHeight')

sinon.spy($rootScope, 'updateHeight')

我试图通过几种不同的方式来窥探这个 updateHeight()

 Typeerror: Attempted to wrap undefined property updateHeight as a function

然而我的错误陈述

.navigation li {    
        display:inline-block;
        vertical-align: middle;
        text-decoration:none; 
    }

由于 updateHeight 是用这个来定义的,所以如果我不能窥探它,我不知道如何调用这个方法。

1 个答案:

答案 0 :(得分:1)

控制器实例(this)在范围内不可用,必须通过controller method检索,具体如下:

element = $compile('<my-directive>')($scope)
var controllerInstance = element.controller('myDirective');
sinon.spy(controllerInstance, 'updateHeight');

为了能够通过$scope到达控制器实例,请在指令中使用controllerAs语法。它提供了更好的可测试性,除了常规控制器的优点外。