1

モカを使用してコントローラーの単体テストを行っています。私のコントローラーは次のようになります。

AS.MyController = Ember.ObjectController.extend(Ember.Validations.Mixin, {

    name: null,
    description: null,

    init: function () {
        this._super();

        this.get('store').find('something');
    },
    ....
}); 

そして私のテストは次のように始まります:

describe("MyControllerTest", function () {
    //tried but didn't work
    //delete AS.MyController.init;
    var controller = AS.MyController.create();
    .....
})  

ブラウザは、init の「this.get('store')」呼び出しで常にエラーをスローします。私のテストケースはストアにまったく依存していないため、物事をスタブ化する必要があるのか​​ 、それとも回避策があるのか​​ わかりません。いずれにせよ、私はそこで多くを見つけることができなかったので、フィードバックをいただければ幸いです.

ありがとう、ディー

JSBIN : http://jsbin.com/aMASeq/3/

更新: この問題に取り組むには多くの方法がありますが、私が最終的に行ったのは、ストアへのすべての関数呼び出しを個別のアクションに入れ、init でこれらのアクション関数を呼び出すことで、コントローラー コードを少し再構築することです。 this.send('アクション名')。単体テストでは、コントローラーをインスタンス化する前に、コントローラーを再度開いてこれらのアクション関数を変更します (init 関数自体を変更するよりもアクション関数を変更する方が簡単です。init を変更しようとすると、常に js エラーが発生します)。例えば:

AS.MyController.reopen({actions: {setSomeActionThatUsesStore: function () {
         //do something that doesn't involve using store
        }}});
4

1 に答える 1

2

コントローラーはコンテナーからストアにアクセスします。モック コンテナーを作成し、それを使用してコントローラーをインスタンス化できます。

var mockContainer = new Ember.Container();
mockContainer.register('store:main', Ember.Object.extend({ 
  find: function() { ... }
});

var controller = App.PostController.create({ container: mockContainer });

実際にアクセスする必要がある場合はstore、アプリのコンテナーからコントローラーを取得するだけです。

var controller = App.__container__.lookup('controller:post');

PostControllerこれにより、すべての依存関係 (ストアなど) が結び付けられた for がインスタンス化されます。

于 2013-11-01T00:01:25.203 に答える