1

次のようなコードの塊があります。

If mode = DiaryMode.Admin Then
    modeObject = DBNull.Value
ElseIf mode = DiaryMode.Academy Then
    modeObject = ApplicationSettings.Academy
ElseIf mode = DiaryMode.Scouting Then
    modeObject = ApplicationSettings.Scouting
Else
    Throw New NotSupportedException()
End If

チェックの考え方は、データベース呼び出しに渡すためにいくつかの値を準備することです。

2 つの質問がありElseます。努力する価値はありますか? その意図は、列挙型の将来の拡張によって、コードが squiify の結果を返すことを防ぐことです。

コードが有効である場合は、テストする価値がある場合は、動作を単体テストできるようにしたいと考えています。どうすればそれを行うことができますか?

4

3 に答える 3

0

他の DiaryMode が受け入れられないとビジネス要件が述べている場合、else ステートメントは、DiaryMode 列挙型の将来の拡張を防ぐために完全に適切に使用されます。

テストに関しては、少しトリッキーになります。すべての有効な状態 (Admin、Academy、および Scouting) を確実にテストします。ただし、実際にはモードを存在しない列挙値に設定することはできず、それが NotsupportedException をスローする唯一の方法になります。列挙型が期待する列挙型のみを運ぶことを確認するテストを作成しようとする可能性があります。

次のようなことを行うことでそれを行うことができます:

Enum.GetNames(typeof(DiaryMode))

そして、それぞれの名前を確認します。

要約すると、私が説明したことから 4 つのテストが必要になります。

  • 管理者テスト
  • アカデミーテスト
  • スカウトテスト
  • DiaryMode 列挙型のすべての名前をチェックするテスト
于 2009-06-05T14:26:39.343 に答える
0

Replace Conditional with Polymorphismを使用して、これをリファクタリングすることをお勧めします。

これらの行のテスト ケースを作成すると、"if...then...else" ステートメントが正しい modeObject を返すことが証明されますが、あまり時間をかけません。ただし、完全に無意味であるとは限りません。新しいモードを追加する予定がある場合、特にカット アンド ペーストが必要な場合 (コードを貼り付けて失敗することは珍しくありません)、テストによってそれらが期待どおりに処理されることが保証されます。それに応じて変更します)。

それが私がすることです: テストケースを書き、リファクタリングしてモードを処理するクラスの階層を作成し、テストを再実行して何も壊れていないことを確認します。計画のようだ?

于 2009-06-05T14:22:04.813 に答える
0

を追加することElseは十分に合理的と思われます。組み込みの Visual Studio 単体テストを使用する場合、実際には、テストが成功した場合に例外をスローすることを期待していることを示す属性があります: ExpectedExceptionAttribute.

于 2009-06-05T14:25:17.287 に答える