如何使用茉莉花间谍控制器方法?

时间:2015-05-07 13:09:27

标签: angularjs unit-testing jasmine

我有一个简单的控制器,只有一个方法。 我在控制器中设置了一个观察者,我想确保在更新模型时调用观察者监听器。

您知道如何检查是否调用了监听器吗?

var app = angular.module('app', []);

app.controller('MainController', ['$scope', function($scope){

$scope.test = 0;

this.method = function(){
  console.log('called');
  $scope.test = $scope.name.length;
};
$scope.$watch('name', this.method);
}]);

describe('controller method ', function(){

  var scope;
  var controller;

  beforeEach(module('app'));
  beforeEach(inject(function($injector){
    scope = $injector.get('$rootScope').$new();
    var $controller = $injector.get('$controller');

    scope.name = 'blabla';

    controller = $controller('MainController', { $scope: scope });
  }));


  it('should watch', function(){
    var s = spyOn(controller, 'method');
    scope.$digest();
   expect(s).toHaveBeenCalled();
  });

  it('true should be true', function(){
    expect(1).toBe(1);
  });
});

http://plnkr.co/edit/B7pgd9x3bPtOlY40NkRm?p=preview

1 个答案:

答案 0 :(得分:1)

你不想窥探控制器的method。您可能希望重命名该方法,将其拆分为多个方法,或者在将来以任何其他方式重构它们。这将破坏您的测试,而您的控制器的实际行为可能没有改变。所以专注于测试控制器行为,而不是监视私有方法。

 it('should set the testing variable', function(){
    // act
    scope.name = 'name';
    scope.$digest();

    // assert
    scope.testing.should.eql(4);
  });