2016-06-22 7 views
0

ジャスミンテストでコントローラのプロパティにアクセスしようとしていますが、テストを設定する際に問題があります。ここでジャスミンがangularjsにアクセスできない1.5コントローラのプロパティ

は、コントローラです。ここ

adminApp.controller('AdminClientController', [function() { 
    var adminClient = this; 
    adminClient.name = 'Client Name'; 
    adminClient.sites = [ 
    { 
     id: "site1", 
     domain: "myschool.com", 
     pages: [ 
      { 
       id: 1, 
       name: "HOME" 
      }, 
      { 
       id: 2, 
       name: "FORM" 
      } 
     ] 
     } 
    ] 

    }]); 

は仕様です:

describe('AdminClientController', function() { 
    beforeEach(module('adminClientApp')); 

    var $scope, $controller; 

    beforeEach(inject(function(_$controller_, _$rootScope_){ 
     $rootScope = _$rootScope_; 
     $controller = _$controller_; 

     $scope = $rootScope.$new(); 
    })); 

    describe('site pages', function() { 

    beforeEach(function() { 
     //$scope = {}; 
     controller = $controller('AdminClientController as adminClient', { 
      $scope: $scope }); 
    }); 

    it('should create a site model with 2 pages', function() { 
     expect(controller.adminClient.sites[0].pages.length).toBe(2); 
    }); 
    }); 

}); 

エラー:

TypeError: Cannot read property 'sites' of undefined 

は、以前私が私がいても($の範囲を初期化してみましたコントローラーで明示的に使用していない)、contollerを構文として使用していませんでした。

beforeEach(function() { 
     $scope = { 
      adminClient: { 
       sites: [ 
        { 
         id: "site1", 
         domain: "myschool.com", 
         pages: [ 
          { 
           id: 1, 
           name: "HOME" 
          }, 
          { 
           id: 2, 
           name: "FORM" 
          } 
         ] 
        } 
       ] 
      } 
     }; 
     controller = $controller('AdminClientController', { 
      $scope: $scope }); 
    }); 

は、私はちょうどテストを始め、早期にそれを使用したいか、そうでなければ、後に起こることはありませんよ。私が見つけた他のSOの質問は私を助けなかった。

ありがとうございます!

+0

あなたがそれを必要としないので、あなたは、あなたのコントローラの範囲に渡していません。これを試してみてください:controller = $ controller( 'AdminClientController'、{});これを次のように参照してください:controller.sites [0] .pages.length – ScottL

+0

ありがとう@ScottL! –

答えて

1

テストケースではアクセスできないコントローラのプロパティではありません。あなたがアクセスできないcontrolleradminClientです。それは存在しないからです。

あなたのcontrollerとして

expect(controller.sites[0].pages.length).toBe(2); 

を指定する必要がありますが

expect(controller.adminClient.sites[0].pages.length).toBe(2); 

を指定した場所は、この場合、あなたのAdminClientControllerへの参照として機能しているものです。あなたがAdminClientControllerを定義したところ@ScottLは、あなたが依存関係として、あなたのコントローラに$スコープを注入していないことから、あなたのテストでそれを必要としない、述べたように、adminClientAdminClientController

への参照として機能している間どちらの場合も。

だから、これは新しいテストケースあなたのようになります。

describe('AdminClientController', function() { 
    beforeEach(module('adminClientApp')); 
    var $controller, controller; 

    beforeEach(inject(function(_$controller_){ 
     $controller = _$controller_; 
     controller = $controller('AdminClientController', { }); 
    })); 

    describe('site pages', function() { 
     it('should create a site model with 2 pages', function() { 
      expect(controller.sites[0].pages.length).toBe(2); 
     }); 
    }); 
}); 
+0

素晴らしい、ありがとう@Siddarth_Ajmera!私はjsオブジェクトがコントローラで定義されているように返されると思っていました(.controller( 'AdminClientController'、[function(){ var adminClient = this;)私のための基本的な誤解。 –

関連する問題