web-dev-qa-db-ja.com

抽象クラスを単体テストする方法

Visual Studioでユニットテストの作成ツールを使用し、明らかにそれは私の抽象クラスをインスタンス化しようとします。

私の質問は:Visual Studioがそれを行うようにしようとしている方法を単体テストしようとするのか、インスタンス化するモッククラスを作成するのか、またはこの抽象クラスを使用するメソッドだけをテストするのか?

ありがとう。

37
ediblecode

この抽象クラスにテストする価値のあるメソッドがある場合は、それらをテストする必要があります。テストの抽象クラスをサブクラス化して(MyAbstractClassTestingのように名前を付けて)、この新しい具象クラスをテストすることができます。

62
sloth

2つの反対の視点があります。

  • 抽象クラス自体をテストせず、それから継承された具象クラスをテストする
  • 抽象クラスもテストする必要があります。継承されたすべてのクラスで共有される組み込みロジックが提供されるため、抽象クラスで基本ロジックを一度テストするだけです。

私は(現在)2番目のオプションと、抽象クラスのモックを作成できる RhinoMocks PartialMock 機能を使用して抽象クラスをテストすることを好みます。

27
sll
  1. 実装クラスをテストするだけです。

  2. 余分な機能を追加しないテスト用の特定の実装をいつでも作成できます。

  3. テストを聞いてください。抽象クラスやプライベートメソッドなどのテストを可能にする魔法のモックツールの使用は、テストコードの匂いです。

5
blank

mockrepositoryからの使用:

[testmethod]
       public void testwithmockrepository()
       {
           var mockrepository = new rhino.mocks.mockrepository();
           var mock = mockrepository.partialmock<myabstractclass>();

           using ( mockrepository.record() )
           {
               expect.call( mock.dosomething( arg<string>.is.anything ) ).return( "hi..." ).repeat.once();
           }
           using ( mockrepository.playback() )
           {
               assert.areequal( "hi..." , mock.dosomething( "salam" ) );
           }
       }
0
mohammad almasi