Angularjs 在控制器内测试命名函数

Angularjs 在控制器内测试命名函数,angularjs,jasmine,Angularjs,Jasmine,菜鸟Jasmine/棱角分明的问题 我在控制器中有一个命名函数,如下所示: .controller( 'DummyCtrl', function DummyCtrl($scope){ var doSomething = function() { return "blah"; }; }) 我需要测试此函数,并尝试通过调用以下Jasmine规范: describe ('myApp', function(){ var $scope, $controller; var

菜鸟Jasmine/棱角分明的问题

我在控制器中有一个命名函数,如下所示:

.controller( 'DummyCtrl', function DummyCtrl($scope){
   var doSomething = function() {
      return "blah";
   };
})
我需要测试此函数,并尝试通过调用以下Jasmine规范:

describe ('myApp', function(){
  var $scope, $controller;
  var DummyCtrl;

  beforeEach(module('myApp'));

  describe('controllers', function(){
    beforeEach(inject(function ($controller, $rootScope){
      $scope = $rootScope.$new();
      DummyCtrl = $controller('DummyCtrl', {$scope: $scope});
    }));

    describe( 'DummyCtrl', function(){
            var blah;

            beforeEach(function(){
                blah = DummyCtrl.doSomething();
            });

            it('should do something', function(){
                expect(blah).toContain("blah");
            });
    });
  });
});

我没有解决问题,而是导致了以下错误:
TypeError:Object没有方法“doSomething”
。我假设这是一件我不理解的超级简单的事情

从某种意义上说,使用这样的函数是私有的,不能从函数外部访问。请查看此链接:

本质上说,如果在javascript中有一个函数/对象,任何带有
this.
前缀的东西都是公共的,任何带有
var
前缀的东西都是私有的

对于Angular,如果不仅仅是为了减少
$scope
变量的内存使用量,您肯定可以使用私有变量和函数。您的
$scope
对象应该调用私有函数,以获取用户要显示/使用的值。尝试将其更改为:

.controller( 'DummyCtrl', function DummyCtrl($scope){
   var doSomething = function() {
      return "blah";
   };
   $scope.something=doSomething();
})
然后使用以下工具测试专用功能:

describe( 'DummyCtrl', function(){
    var scope = {},
        ctrl = new DummyCtrl(scope);
    it('should do something', function(){
        expect(scope.something).toMatch('blah');
    });
});

Angular将使用为控制器注册提供的
函数DummyCtrl
。如果需要控制器实例公开
函数doSomething
,而不将其附加到
$scope
,则应将其附加到

试着改变

var something = function(...

而且你的测试应该有效


您可以在此处看到此方法:。还可以看看这个问题:

这就成功了。我希望能够调用这些私有函数来简化一些单元测试(在调用这些方法的$scope函数上)。但我相信我可以找到一种方法,使用他们的名字。这应该被标记为答案。另一个没有完全解决这个问题。
this.something = function(...