1

モック/スタブにはRhinoMocksを使用し、単体テストにはNunitフレームワークを使用しています。

次のクラスがあります

    class A
    {
        private int data = -1;

        public void Initialize (int data)
        {
            this.data = data;
        }

        public void CallA()
        {
            if (data == -1) throw new InvalidArgumentException("data has invalid value -1");
            try
            {

                A1("a1");
                A2("a2");
            }
            catch (AException e)
            {
                throw;
            }  

            catch (Exception e)
            {
                throw new AException(ErrorCode.UnknownException, e);
            }  
        }
        private void A1(string item)
        {
        }

        private void A2(string item)
        {
        }

    }

私は次のテストケースに苦労しています:

  1. InvalidAgrumentException:いずれかのInitializedメソッドが呼び出されないか、引数として-1が渡された場合に発生しInitializedます。データはプライベートであるため、モックすることはできません(ILウィービングを実行するTypeMockアイソレーターなどのライブラリが使用されるまで)。この例外を発生させるための1つのオプションは、正しいアプローチかどうかわからないメソッドを呼び出すことです。(他の場所からもデータを-1に設定できるため。問題ありませんが、追加の関数呼び出しが必要です。)Initialized

  2. A1が「a1」パラメーターで呼び出され、A2が「a2」パラメーターで呼び出されることを確認します。

4

2 に答える 2

4

ダニエルは良い点を指摘しているので、彼の答えを少し広げたいと思います。テストをプライベート メソッド呼び出しに依存させると、非常に脆弱なテスト スイートが作成されます。プライベート メソッドは実装の詳細であり、内部実装の変更に関して常に安全に変更し、10 ~ 20 個のテストの失敗を観察しないようにする必要があります。

メソッドのもう 1 つのポイントInitilize- テストが難しい場合は、クラスの使用がどれほど難しいかを想像してください。Robert Martin は、彼の著書の 1 つで良い点を指摘しています。そのメソッドには、他のどのメソッドを、どの順序で呼び出す必要があるかが記載されていません。

たとえば、あなたの場合、public void CallA()いつ、どの引数を呼び出す必要があるのか​​ について何も述べていませんInitializeInitialize入力引数を使用してコンストラクターを作成するか、コンストラクターから Initialize を呼び出してみませんか。これで、それが呼び出されたことを確認できます。もう一点、マジックナンバーについて-1です。

批判して申し訳ありませんが、私はそのようなデザインを扱ってきましたが、どのようなテスト/モッキング フレームワークを使用していても、それらをテストするのは非常に困難です。メソッドをモックすることもprivate、静的メソッド呼び出しをスタブ化することもできますが、最終的にはフレームワークのモックの力ではなく、すべてが優れた設計になります。

于 2013-01-16T11:38:54.840 に答える
2

そんなことはできません。

モック フレームワークは、テストするクラスの依存関係をモックするために使用されます。クラスの代わりにモックをテストすることを意味するため、クラス自体をモックすることは意味がありません。

さらに、クラスのプライベート メソッドが呼び出されたことを確認することも正しくありません。他の方法で確認する必要があります。2 つの一般的なアプローチは次のとおりです。

  1. クラスが正しい状態であることを確認する
  2. モックされた依存関係の特定のメソッドが呼び出されたことを確認します

どちらを使用できるか、または使用する必要があるかは、主にテストするクラスによって異なります。

于 2013-01-16T11:20:33.737 に答える