同じクラス内の他のメソッドを呼び出す方法のための状態ベースのテストを作成する方法?

StackOverflow https://stackoverflow.com/questions/1519882

  •  19-09-2019
  •  | 
  •  

質問

私は(私が質問のためにダウン易しく書き直さました)次のコードを持っています:

    public void HandleModeInit(int appMode){
        switch(appMode){
            Case 1:
                DoThis();
            Case 2:
                DoThat();
            Case 3:
                //no mode 3
            Case 4:
                DoSomethingElse();
            Case else:
                //do nothing
        }
    }

どうでしょうあなたのユニットテスト、統合テストにそれを回すことなく、この方法(あなたはDoThis()、DoThat()、およびDoSomethingElse()が何をしているかテストを終わる場合)?方法に作られていますこれらのメソッド呼び出しは、の中にをのでHandleModeInit()と同じクラス、あなたはこれをテストする方法を?

理想的には、メソッド呼び出しが別のクラスに出て抽出されるであろうが、どのような場合には、この動きはどんな意味がない?

役に立ちましたか?

解決

あなたは、このメソッドに渡されているものを管理している場合は、

私はAppModeImplementationFactoryある引数としてAPPMODEをとるインタフェースに渡します。この工場の目的は、AppModeImplementationsを作成することです。次のように工場はなります:

public class AppModeImplementationFactory: IAppModeFactory
{
   public IAppModeImplementation Create(int appMode)
   {
      // switch case goes here to create the appropriate instance
   }
}

あなたは工場出荷時に渡すと、これは嘲笑インスタンスすることができ、作成したメソッドが呼び出されたことを確認することができます。あなたが返されるインスタンスのタイプを確認したい場合は、別のテストの下でそれを行う必要があります。工場出荷時は、あなたがAPPMODEに基づいて必要な実装を返しますので、このアプローチは、理由のアプリモードのロジックを実行するあなたの必要性を果たしていきます。

ホープ、このことができます。

他のヒント

代わりにappModesを切り替えるスイッチ/ case文を使用しての、あなたはIAppModeと呼ばれるインターフェイスを作成することができます。

(私は、彼らはすでににint型に渡しているので、呼び出し側が適切にIAppModeを実装することをインスタンス化するために、どのオブジェクトを決めることができると仮定します)アプリケーションモードを表します。

あなたの呼び出し側は、あなたの方法はIAppModeのDoThis()メソッドを呼び出すことができ、IAppModeオブジェクトを渡します。

これで、IAppModeを実装ダミーオブジェクトを作成し、テスト中にメソッドにそれを注入することができます。

これはあなたのコードのeaser(デザインパターンを使用すると、それを行うことができます)と、テスト可能なになります。

私は、コードがダウン易しく書き直されていること(特にあなたがそれを指摘した)を実現していますが、呼び出されたメソッドは、この場合には何をすべきかをテストしていない場合は、あなたが実際に何をテストしていますか? appModeの値は?

どのようにまさにこれが呼び出されたメソッドの内部で何が起こっているのかについて、いくつかを知らずに言うのは難しい(不可能ではない)で攻撃します。彼らは嘲笑することができます任意のアウトバウンド(外部サービスに、データベース、何でも)で通話を発信していますか?もしそうなら、それはフォワードパスかもしれません。彼らはクラスでカプセル化された動作のみが含まれている場合は、おそらく彼らは、コールがリターンをHandleModeInitするときに確認することができ、いくつかのプロパティの値を変更する?

私は、一般的に、それはより多くのテスト可能作るの唯一の目的のために私のコードの設計を変更することのファンではないけど、一つのアプローチは、内部からクラスのパブリックインターフェイスを分離した後、内部インターフェースとして定義することですよく、インターフェース。あなたが内部をあざけるために開くその方法ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top