8

私は AngularJS で依存関係の注入に頭を悩ませようとしています。これが私の非常にエキサイティングなアプリケーション コードであるとしましょう。

function PrideRockCtrl($scope, King) {
  $scope.king = King;
}
  
angular.module('Characters', ['ngResource'])
  .factory('King', function() {
    return "Mufasa";
  });

テストしたいPrideRockCtrl。ドキュメントとチュートリアルの例に従えば、 を使用しmodule('Characters')てインジェクターを構成し、 を使用inject()していくつかの依存関係を取得できます。すなわち:

describe('Pride Rock', function() {
  beforeEach(module('Characters'));
  it('should be ruled by Simba', inject(function($rootScope, $controller) {
    var scope = $rootScope.$new();
    var ctrl = $controller(PrideRockCtrl, {$scope: scope});
    expect(scope.king).toEqual("Mufasa");
  }));
});

これは問題なく動作しますが、これはクロス テスト フレームワークのソリューションではありません。module()およびテスト ヘルパーは、Jasmine とのinject()み互換性があります。

module()またはを使用せずに同じ依存性注入を手動で達成する最良の方法は何inject()ですか?

私はこれを思いついた:

describe('Pride Rock', function() {
  it('should be ruled by Mufasa', function() {
    var $injector = angular.injector(['Characters']);
    var $controller = $injector.get('$controller');
    var scope = $injector.get('$rootScope').$new();
    var king = $injector.get('King');
    var ctrl = $controller(PrideRockCtrl, {$scope: scope, King: king});
    expect(scope.king).toEqual("Mufasa");
  });
});

これは非常に冗長に思えます。より良い方法はありますか?

jsFiddle: http://jsfiddle.net/johnlindquist/d63Y3/

4

2 に答える 2

4

Angularコントローラーは単なるJS関数です。何も注入したくない場合は、電話してください。

describe('king should be set', function() {
  var scope = {};
  var lion = "Simba";
  PrideController(scope, lion);
  expect(scope.king).toEqual(lion)
});
于 2012-11-18T02:23:37.080 に答える
4

モジュールを使用しない最も単純なバージョンは次のようになります。

describe('Pride Rock', function() {

    it('should be ruled by Simba', inject(function($rootScope, $controller) {
        var scope = $rootScope.$new();
        var ctrl = $controller(PrideRockCtrl, {
            $scope: scope,
            King:"Mufasa"
        });
        expect(scope.king).toEqual("Mufasa");
    }));
});

実際、あなたはあなたの試みにかなり近かったのですが、欠けていたのはコントローラーのローカル依存関係だけでした ( King:"Mufasa")。

このようなテストでは、依存関係を手動でモック/スタブできるため、$injector を使用する必要はありません。結局のところ、$injector は単にオブジェクトのインスタンスを提供しているだけなので、それらを自分で作成することもできます。

于 2012-09-19T06:54:23.750 に答える