2012-04-25 18 views
1

カラムベースのデータベースのデータフィールドは、DataFieldクラスにマッピングされます。各データフィールドオブジェクトで、GetValue<T>()メソッドを呼び出すことができます。ユニットテストのための不正なパラメータクラスを作成する抽象的な方法

Tが不正な型の場合、例外がスローされます。ユニットテストではどのような型を渡すべきですか?違法型を渡すと例外がスローされるかどうかテストします。私の心に来る次の知られている違法なタイプですか?それとももっと抽象化したアプローチがありますか?

​​30

したがって、すべての型は渡されるとこの例外をスローする必要があります。だから私は一種のダミータイプが必要でしょうね。

現時点では私のユニットテストは、次のようになります。

[Fact] 
public void If_T_is_illegal_type_an_exception_gets_thrown() 
{ 
    _dataField = new DataField(_params); 
    Assert.Throws<Exception>(() => _dataField.GetValue<Type>()); 
} 
+2

違法タイプの例は何ですか?これを正しく実行すると、単体テストではなく、コンパイラがキャッチできます。 – yamen

+0

私の投稿を更新しました。 –

答えて

2

は、ユニットテストは、すべてのコードパスを介して取得しようとしていると正しい動作を保証していることを覚えておいてください。合計6つのテストが必要です.1つは有効な5つのタイプごと、もう1つは(最終的なコードパスをカバーする)のタイプのです。なぜあなたはもっと抽象的なものが必要なのかわからない。これは、実行時ではなくコンパイル時のテストになるように

あなたは明示的な変換とキャストを使用することを好むことがあります。http://msdn.microsoft.com/en-us/library/xhbhezf4(v=vs.100).aspx

+0

私はちょうど標準の種類があったと思った、またはデフォルトの、* "他のタイプ" *を表すタイプが与えられました。明示的な変換は非常に良い見えます。これらのオブジェクトを別の一般的な方法でキャストしていますが、 '(T)_dataField.GetValue ()'です。しかし、コンパイル時定数ではないので、明示的な変換は 'T'では機能しません。 –

0

を現在あなたはあなたのコードがtypeof(T) 5回呼び出すと5つの比較を行いますGetValue<bool>()呼び出す場合。次に、boxedブール値をobjectとして返します。そして最悪のことは、このメソッドのシグネチャでは、どの型が許可され、どの型が例外をスローするかについては何も言わないということです。 GetValue<decimal>()に電話できますか?わからない。私は試して、それが許可されていない場合は実行時の例外があります。

が必要なタイプのためにオーバーロードされたメソッドを作成することを検討して:

bool GetBooleanValue() 
decimal GetDecimalValue() 

これは、それが返すことができますどのような種類の完全に記述します。内側にチェーンがある場合は長くありません。呼び出し元はオブジェクトを受け取りません。そして、あなたはこれらの方法のそれぞれについて、疑問なくテストします。

+0

これは私たちのプロジェクトには合いません。実際には、データフィールドからOurUIDataFieldsにデータを抽出します。 OurUIDataFieldsクラスは汎用クラスです。オーバーロードを作成する場合は、さまざまなgetメソッドを呼び出すためにT以上のスイッチが必要になります。私は、DataFieldを汎用クラスにリファクタリングする方が良いアプローチだと思います。 –

0

上記のように、サポートされているタイプごとに1つのテストとサポートされていないタイプのテストで十分です。

私が注意していることは、例外がエラーの唯一の予期された結果ではないことです。エラーがログに記録されていることをどのように確認していますか?
これを行う方法はありますか?
もしそうでなければ、必要な/必要がありますか?

また、全く迷惑コードレビューポイント...なぜ

if (typeof(T) == typeof(bool)) return ValueBoolean == true; 

代わりの

if (typeof(T) == typeof(bool)) return ValueBoolean; 

アラン。

+0

私はDataFieldクラスで静的ロガーのモックを作成します。 'Log.Error()'が呼び出されると、私はこの呼び出しをキャッチし、私の単体テストでboolの 'errorFired'変数を設定します。 'return ValueBoolean == true':これも認識しました。この種のコードはReSharper経由で削除されます。 –

+0

いいですね。サンプルコードでチェックされていないので、私はそれを言及すると思った。 – AlanT

関連する問題