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 DummyCtrlAngular によってコンストラクターとして使用されます。コントローラ インスタンスを にfunction doSomethingアタッチせずに を公開する必要がある場合は$scope、 にアタッチする必要がありますthis

変更してみる

var something = function(...

this.something = function(...

そしてあなたのテストはうまくいくはずです。

このアプローチは、http: //jsfiddle.net/yianisn/8P9Mv/で確認できます。この SO の質問もご覧ください: How to write testable controllers with private Methods in 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 に答える