2017-01-02 5 views
1

コントローラの一部である2つの別々の関数を呼び出すEmberコントローラで定義されたアクションが1つあります。私は、アクションメソッドが正しい関数を呼び出したかどうかを確認するために、ユニットテストでそれらの関数を模擬したいと思います。エムバーコントローラをユニットテストする方法

私のコントローラは次のようになります。実際には

export default Ember.Controller.extend({ 
    functionA() { 
     return; 
    }, 
    functionB() { 
     return; 
    }, 
    actions: { 
     actionMethod(param) { 
      if(param) { 
       return this.functionA(); 
      } 
      else { 
       return this.functionB(); 
      } 
     } 
    } 
}); 

、コントローラの作品は、しかし、ユニットテストでは、関数Aおよび関数Bは両方とも未定義です。私はthisをコンソールに記録しようとしましたが、functionAとfunctionBがどこにあるのかを見つけることができませんでしたので、正しくモックすることができません。私はそれらが行動の隣にあるオブジェクトの最上位レベルにあると期待しましたが、代わりに_actionsが見つかり、actionMethodが正しく定義されていました。

私のユニットテストは次のようになります

以下
const functionA = function() { return; } 
const functionB = function() { return; } 
test('it can do something', function(assert) { 
    let controller = this.subject(); 
    // I don't want the real functions to run 
    controller.set('functionA', functionA); 
    controller.set('functionB', functionB); 
    controller.send('actionMethod', ''); 
    // raises TypeError: this.functionA is not a function 

    // this doesn't work etiher 
    // controller.functionB = functionB; 
    // controller.functionA = functionA; 
    // controller.actions.actionMethod(); 
} 

は、誰もが、私はテスト環境でこれらの機能を置き換えることができる方法上の任意のアイデアを持っていますか?または、おそらく、この機能をテストするか、コントローラをセットアップするより良い方法がありますか?

  • 編集 タイプミス:this.subject this.subjectする()
+0

サイドノート:1.コントローラオブジェクトを作成するには、 'this.subject()'を呼び出す必要があります。 2. 'controller.send'メソッドは、呼び出し元に値を返しません – kumkanillam

+0

Whoops typo - 私は' this.subject() 'を呼び出しました。 'controller.send'に関しては、上記のように' controller.actions.actionMethod() 'を呼び出すようにしました。 – user2989731

答えて

1

、あなたはthis.subject()関数にパラメータを渡すことができます:the sample twiddle

let controller = this.subject({ 
    functionA(){ 
     //this function overriddes functionA 
    }, 
    functionB(){ 
     //this function overriddes functionB 
    }, 
}); 

ルック。

このメソッドは、注入されたコントローラのserviceを置き換えるのに特に便利です。

0

は、だからあなたのコントローラは、このように見ていることでしょう、あなたが扱っている、対応するプロパティを導入し、私たちはnameプロパティを言わせて、 、

import Ember from 'ember'; 
export default Ember.Controller.extend({ 
    name:'', 
    functionA() { 
     this.set('name','A'); 
    }, 
    functionB() { 
     this.set('name','B'); 
    }, 
    actions: { 
     actionMethod(param) { 
      if(param) { 
       return this.functionA(); 
      } 
      else { 
       return this.functionB(); 
      } 
     } 
    } 
}); 

nameプロパティ値は、actionMethodを呼び出した後でテストできます。 ユニットテストでコントローラの機能を置き換えるために

test(" testing functionA has been called or not", function(assert){ 
    let controller = this.subject(); 
    controller.send('actionMethod',true); 
    //If you would like to call functionA just say controller.functionA() 
    assert.strictEqual(controller.get('name'),'A',' name property has A if actionMethod arguments true'); 
    controller.send('actionMethod',false); 
    assert.strictEqual(controller.get('name'),'B',' name property has B actionMethod arguments false'); 
}); 
+0

私は自分自身を学ぶためにあなたの質問に答えようとしています、率直に言って、私は書いていません私のプロジェクトでのテスト – kumkanillam

+0

オブジェクトを作成中に動的にプロパティを定義したい場合は、 'create()'を使ってオブジェクトを作成するときと同じように 'subject'メソッドの引数として渡す必要があります。 'this {{functionA:function(){this.set( 'name'、 'AA'); return;}});' – kumkanillam

関連する問題