8

一个新手 Jasmine/Angular 问题。

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

.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 #<DummyCtrl> has no method 'doSomething'. 我假设这是我不理解的超级简单的事情。

4

2 回答 2

18

您为控制器注册提供的function DummyCtrl内容将被 Angular 用作构造函数。如果您需要控制器实例公开function doSomething而不将其附加到$scope,则应将其附加到this.

尝试改变

var something = function(...

this.something = function(...

你的测试应该有效。

你可以在这里看到这种方法:http: //jsfiddle.net/yianisn/8P9Mv/。还可以看看这个 SO 问题:如何在 AngularJs 中使用私有方法编写可测试的控制器?

于 2013-11-26T21:11:38.970 回答
5

从某种意义上说,使用这样的函数是私有的,不能从函数外部访问。看看这个链接:http: //javascript.crockford.com/private.html

本质上说的是在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');
    });
});
于 2013-06-18T22:35:37.457 回答