3

派生クラスがその base 1と対話する方法をテストするには、3 つの一般的なパターンがあるようです。以下にリストした理由により、私はそれらのどれもあまり好きではありません。基本クラスの相互作用をテストするために、これらの (または別の) メソッドのいずれかで長期的に成功した人はいますか?

  • アクセス修飾子を変更してFriend( internalC# で) アクセスを許可InternalsVisibleToし、モッキング フレームワーク / 単体テスト アセンブリを含めるように設定します。

テストを可能にするために SUT を変更することは、テストの匂いです。メソッドが である場合はProtected、それが適切な設計であるためです (実際には、 ( )Protectedの「有効な」使用法と呼ぶものをまだ確認していません)。Protected Friendprotected internal

これは、単一のメソッドをモックするために多くの余分な作業を必要とし、完全に型安全ではありません (たとえば、名前を変更するとそれが殺されます)。(少なくとも VB では)、Moduleメソッドを配置するための を作成する必要があります。悪夢です (モジュールはクラス内に入れることができないためFriend、最大限に制限する必要があり、ジェネリックはより複雑になります)!

  • 動作テストの代わりに状態テストを使用します。

基本クラスの複雑さによっては、同じことに対して単一の動作テストよりも多くのテストが必要になる場合があります。Me.AssertWasCalled(Function(s) s.SendMessage(messageText, [to]))where SendMessageis a base class Protectedmethodに一致する状態テストで何が必要になるかを考えてみましょう。

1String注: これは、メソッドの名前による保護されたメソッドのモックをサポートする Moq では必要ありません。上記のリンクで Ayende が言及しているように、彼は Rhino Mocks での非コンパイル時のタイプ セーフなモッキングを具体的に回避しました (これは良いことだと思います!)。

4

1 に答える 1

4

あくまでも私の勝手な意見です。

一般に、基本クラスとの相互作用をテストすることはお勧めできません。ここで実装の詳細をテストする予定です。

継承されたクラスを基本クラスと一緒にテストするのが複雑に思われる場合は、おそらくリファクタリングして継承の代わりに集約を使用する時期でしょうか?

于 2012-12-12T21:05:34.330 に答える