2012-03-22 8 views
1

各クラスにテストをコピーすることなく、抽象クラスのインターフェイスメソッドの実装の動作をテストするにはどうすればよいですか?ユニットテストインターフェイスの実装方法、それを行うには?

私は(複数の)インターフェイスを実装するクラスを持っています。私は各インターフェイスの動作を知っています。テストメソッドでこれを定義して、インターフェイスの実装ごとにこれらのテストを手動で繰り返す必要はありません。

テストごとに抽象クラスを作成し、コンクリートクラスの新しいインスタンスを作成する抽象メソッドCreateSUT()を作成できました。しかし、C#は多重継承をサポートしていないので、クラスが実装する各インタフェースに対して同じCreateSUT()実装を持つ新しいクラスを作成する必要があります。これを行うより良い方法はありますか?

また、いくつかの非抽象サブクラスを持つ抽象クラスで実装されたインターフェイスをテストして、少し複雑になっていることにも注意してください。


この質問はない私はユニット私のインターフェイスの実装をテストする必要があるかどうかについてです。インターフェイスの実装がどのように動作する(null値を返すことはなく、読み取り専用のコレクションを返すなど)と、これらのテストをまとめることで、テストするのがはるかに簡単になることが分かっているので、その実装は、多くの場合があります。

+0

は、まあ、3つのオプション1.がありますインターフェイスをテストするものではありません - あなたは減少しました。 2.それぞれの派生クラスをテストします。 3. 1つの派生クラスのみをテストします。 – gdoron

+0

「私は作成できる...」という段落であなたが何を言っているのか分かりません。インターフェイスにファクトリメソッドを含める必要はありません。また、「多重継承の欠如」という問題が発生している理由も理解できません。あなたはまだいくつかのインターフェイスを実装しているクラスを持つことができます。これはあなたのケースについてです。 – Tormod

答えて

0

抽象クラスをmoqでモックするか、すべてのインターフェイスを実装するインターフェイスを作成してから、抽象クラスで新しく作成したインターフェイスを実装して新しいインターフェイスをモックすることができます。

+0

質問に答えるのに関連するビットを指摘できますか? – Virtlink

+0

新しいコンテンツで更新されました –

0

これはなぜ必要なのか分かりませんでしたが、あなたのインターフェイスのテストで静的ヘルパークラスを書くことができます。例えば。

public static class IFooTests 
{ 
    public static void ShouldDoSomething(this IFoo foo) 
    { 
     // Assert something 
    } 
} 

後、すぐにテストメソッドを作成することができIFooインターフェイスを実装するすべてのオブジェクトのために:

[Test] 
public void ShouldDoSomething() 
{ 
    Bar bar = new Bar(); // create and setup your concrete object 
    bar.ShouldDoSomething(); // call interface test extension 
} 
0

あなたは、各要素を通過した後、あなたのインターフェイスのすべての具体的な実装のインスタンスを保持するリストを作成することができますあなたのテストで不変量を表明してください。

テストフレームワークによっては、テストが失敗したときに実用的なフィードバックを得る方法があるはずです。

クイック検索は、NUnitのために私これを見つけた:http://www.nunit.org/index.php?p=testCaseSource&r=2.5.9

関連する問題