2009-10-12 7 views
12

メソッドのための便利なオーバーロードを作成することは、私にとっては本当に一般的です。ここで私がやるかもしれない何かの例です:便利なオーバーロードのためにテストを複製する必要がありますか?

public void Encode(string value) { 
    Encode(value, DefaultEncoding); 
} 

public void Encode(string value, Encoding encoding) { 
    // ... 
} 

私はユニットテストにもっと注意を払うように始めており、このようなメソッドをテストすることは、私は一人で近づくことが自分自身を信頼してわからないんだけど、いくつかの障害物を紹介しています。最初の最も重要な問題は、両方の過負荷のテストを複製する必要があるかどうかです。たとえば、の値がの場合、両方のメソッドでArgumentNullExceptionがスローされます。 のロジックが異なることがあり、2つのテストを書くことができますか、または利便性の過負荷には独自のロジックがないと想定する方が良いでしょうか?

私も二次的な問題があります。私の命名計画はRoy Osheroveの "MemberName_State_ExpectedResult"と同じです。私がテストを複製すると、いくつかの奇妙な命名規則を導入せずに名前が衝突してしまいます。あなたがテストを複製する場合、これをどのように扱いますか?

答えて

1

私はしばしば、便利メソッドを呼び出したコアメソッドと同じレベルの詳細でテストしません。たとえば、ArgumentNullExceptionの場合です。私はそれを二度はテストしません。私の感想は、ユニットテストはホワイトボックステストです。私は実装を知ることが許されています。

もちろんこれは、私が行って後でリファクタリングして、便利な方法に機能性を追加するために燃え尽きることを意味する可能性があります。しかし、私はTDDをするのはかなり上品です(最初の段落から分かるように全熱狂者ではありません)。だから私はおそらく、その新しい機能のテストを書いてそれをカバーすると思います。

私は多かれ少なかれ正しいと主張していません。それは私がしていることです。すべてのコンストラクタは完全に指定されたコンストラクタを呼び出す場合

0

、私が過負荷のために何か
ConstructorShouldDoThisAndThat()
2)のような専用ユニットテストでなければなりません、
1)あなたの現在のユニットテストにテストを破ります、 ConstructorWithNoEncodingShouldSetEncodingToDefaultEncoding()

6

のように、過負荷用途をデフォルトのものを指定し、「2つのテストを書いたり、それがより良い利便性のオーバーロードは、独自のないロジックを持っていないことを前提としているのですか?」

Umm ....あなたのテストは「前提条件」で定義されていません。それらはテストしているクラスのデザインによって定義されています。

「前提条件」に基づいて何もしません。便利な機能は、実際に便利な機能である場合

することは、それは同じことを行う必要があります実際に両方のバリアント方法が同じことを行うことを実証しているテストを記述する必要があります。 「そこ異なるロジック可能性」(1)それは本当に便利な関数ではなく、(2)あなたは(実際には両方のバリアント方法が正しいことを行うことを実証しているテストを記述する必要がある場合は

それは異なる論理で同じかもしれません、または異なっているかもしれません、私は質問から言うことができません。)

"MemberName_State_ExpectedResult。私はテストを複製する場合は、私が名前衝突している"

は愚かな一貫性の問題を避けてください。署名が異なる同じメソッドを使用している場合、この命名規則はあまり良くありません。忠実にそれに固執する、それは問題にもかかわらず、愚かな一貫性です。

引数シグネチャだけで区​​別されるメソッドがある場合は、これを自明に使用することはできません。だから、すべてのあなたの便利機能のために働く何かを作ってください。

+0

+1両方のアカウントで+1します。便利なメソッドの動作を確認する簡単な方法については、この質問への私の答えを参照してください。 –

1

私は答えが簡単だと思います。オーバーロードされたメソッドが機能するかどうかは気になりますか?彼らが働くことを気にしているなら、あなたがそれらをテストしない限り、あなたはどのように確かに知っていますか?

オーバーロードされた関数の出力とオーバーロードされた関数の出力を比較するテストを作成するのに約15秒かかります。やり直してください。

2

私が通常行っていることは、「実際の」方法を作ることです。仮想。これは、テスト固有の派生クラス(通常は動的モックによって作成される)を使用して便利メソッドをテストして、実際のメソッドを正しく呼び出すことを検証できることを意味します。

「実際の」方法と簡便な方法の唯一の違いは、特定のパラメータにデフォルト値を使用することです。これを単一の単体テストでカバーして移動することができます。

私は、命名規則に関する2番目のS.Lottの答えです。

関連する問題