2016-04-19 8 views
1

私のプロジェクトでは、スティッキフォームなどのセッション変数を設定およびクリアするクラスSessionManagerがあります。そのクラスのすべてのメソッドは、Silex \ Applicationオブジェクトをパラメータとして取ります。どのようにこれらのメソッドを単体テストできますか?各テストメソッドでSilexアプリケーションオブジェクトを作成しますか? 私はSilexとユニットテストの初心者ですので、これをどう対処するか分かりません。 1つの方法のSilex Applicationをパラメータとするユニットテストメソッド

例:

public static function setMessage($message, $messageClass, Application &$app) 
{ 
    // store message as array, with content and class keys 
    $app['session']->set('message', array(
     'content' => $message, 
     'class' => $messageClass 
    )); 
} 
+3

本当にアプリケーション全体を渡す必要がありますか?そのパターンは本当に良いではないようです。 setMessageで使用する必要があるサービス/クラスを渡すだけでよいはずです。あなたの場合は、セッションクラスを渡す必要があります。単体テストについて、注入が "複雑な"クラスの場合は、phpunitが提供する疑似データを使用することを検討する必要があります。 – olibiaz

答えて

3

まず私は$appがあなたSessionManagerのの依存すべきではないと思います。 $app['session']にする必要があります。しかし、それは個々のメソッドではなく、オブジェクト(すなわち:コンストラクタに渡される)の依存関係でなければなりません。

しかし、それは問題を解決するための戦術を変更しません。あなたがする必要があるのは例えば、あなたが呼び出す必要が依存する方法をカバーして、セッションのモックを作成することです:

// in your test class 
// ... 
public function setup(){ 
    $mockedSession = $this->getMockedSession(); 
    $this->sessionManager = new SessionManager($mockedSession); 
} 

public function testMessage(){ 
    // test stuff here 
} 

private function getMockedSession(){ 
    $mockedSession = $this->getMockBuilder('\Symfony\Component\HttpFoundation\Session\Session') 
     ->disableOriginalConstructor() 
     ->setMethods(['set']) 
     ->getMock(); 

    $mockedSession->method('set') 
     ->willReturn('something testable'); 

    return $mockedSession; 
} 

あなたはおそらく唯一のあなたのsetMessage方法はにその$message$messageClass値を通過することをテストする必要があります嘲笑された方法:それがすべてです。この光であなたはおそらく->with('message', [$testMessage, $testClass])かあなたのモックの何かをしたいです。正確な実装は、テストする方法になります。

関連する問題