2016-07-13 3 views
0

私はTDDを実行できるようにAngular 1.5アプリケーションのコントローラでユニットテストを実行しようとしていますこれ以降、他のすべてのコントローラーで使用できます。しかし、それは少し頭痛に変わっています。これらのコントローラをモジュールとしてエクスポートすると、AngularJS(1.5)のユニットテストコントローラ(頭痛...)

ng-controllersのテストに関する話題のチュートリアルとブログ記事はすべて、自分のアプリが使用するコントローラを注入し、実際のアプリケーションを注入することでそうするようです。

私がビルドしているアプリケーションは、コントローラ用の関数をエクスポートしています。これが私の頭痛の原因になっているのだろうかと思います。

// Controller file 
const myController = (app) => { 
    const controller = app.controller('MyCtrl', ['$scope', 'SomeService', ($scope, SomeService) => { 
    // Stuff in here 
}]) 

    return controller 
} 

module.exports = { 
    init: myController 
} 

上記で呼び出されます:ここで

は一例です。このコントローラのための私のユニットテストでは、

myController.init(angular.module('myApp')) 

だから、私はこの中にセットアップをやろうとしています方法:

// Test file 
const myController = require('../path/to/myController') 
const app = angular.module('testModule', []) 
myController.init(app) 

describe('Controller tests: ',() => { 
    it('should work', inject(($controller) => { 
    const testMyCtrl = $controller('MyCtrl', { 
     $scope: {} 
    }) 
    assert.equal(true, true) 
    } 
} 

しかし、私は試してみて、(カルマとモカを使用して)これをテストするとき、私が手:

Argument 'MyCtrl' is not a function, got undefined 

悲しいことに、私はAngularJSの単体テストに精通しているわけではありません。私はちょうどここでドットに参加するのに苦労しています。誰もセイジアドバイスを持っていますか?

答えて

0

これで今すぐソートされました。私は、私のユニットテストに続いて

import MyCtrl from './path/to/controller' 
MyCtrl.$inject = ['$scope', SomeService] // Where 'SomeService' is also imported into this file 
const app = angular.module('MyApp', []) 
app.controller('MyCtrl', MyCtrl) 

// Controller file 
const MyCtrl = ($scope, SomeService) => { 
    // Stuff here 
} 

module.exports = myCtrl 

その後、私はこのように私のapp.jsファイルでそれをインスタンス化:私はそれは次のようになりますので、私のコントローラファイルを修正終わってきましたテストアプリを作成し、同じ方法で必要なサービスとコントローラをインスタンス化する 'test-app.js'ファイル(これはおそらく本当に不要で、実際のアプリを使ってもうまく動作しますが、それらは完全に分離された)。それから私のコントローラをテストするファイルで、私は持っています。

// Controller's unit test file 
describe('MyCtrl tests: ',() => { 
    var myCtrl 
    var $scope 
    var SomeService 

    beforeEach(angular.mock.module('testApp')) // testApp is created in test-app.js 
    beforeEach(angular.mock.inject(($controller, $rootScope, _SomeService_) => { 
    SomeService = _SomeService_ 
    $scope = $rootScope.$new() 
    MyCtrl = $controller('MyCtrl', { 
     $scope: $scope, 
     SomeService: SomeService 
    } 
    } 

    // tests... 
}) 

これですべてのテストでコントローラにアクセスできます。うまくいけば、これは将来の誰かに何らかの使用のものになるでしょう。 :)

関連する問題