0

列挙型を別の列挙型にマップする既存のメソッドの単体テストを作成する必要がありました。この単体テストは、マッピングがメソッドで定義されておらず、switch ステートメントのデフォルト ブロックで例外が発生した場合のシナリオに関係しています。

enum players{sachin, ponting, mculum, gayle}
enum teams{westindies, australia, india, newzealand, southafrica}

public teams MappingMethod(players p)
{
  switch(p)
  {
    case sachin: return india;
    case gayle: return westindies;
    ......
    default: throw new ArgumentOutOfRangeException();
  }
}

ExpectedException 属性を使用して単体テストを試みたところ、上記のシナリオでは単体テストは正常に機能しました。ただし、列挙内のすべての項目にマッピングが存在する場合は失敗します。

これを解決するために、単体テスト内で try..catch ブロックを使用し、ExpectedException 属性を使用する代わりに Assert.IsInstanceOfType を使用して例外をチェックしました。

この単体テストを行うための他の良い方法はありますか?

4

1 に答える 1

1

あなたが達成したいのは、最初の列挙型の各項目が他の項目に対応するようにする方法です。つまり、MappingMethod常に成功したいということです。この場合は、まったく必要ないことをお勧めしますExpectedException。のすべての要素を繰り返し処理しPlayers、それぞれに対して MappingMethod を呼び出すテストを作成するのはどうですか? マップされていないプレイヤーがいる場合、このテストは失敗します。

これに加えて、無効なデータを取得したときに予想される例外がスローされることを確認するテストを作成できます。このようなもの:

[TestMethod]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void Throw_Exception_When_Mapping_Does_Not_Exist() {
    MappingMethod((Players)-1);
}

塩のピンチでこの正確なコードを取ってください-私が間違っていなければ、実際の列挙型のどの要素にも対応しない((Players)-1)タイプのオブジェクトが得られます(もちろん、そのような値を割り当てていない限り)。Playersしたがって、への呼び出しMappingMethodは確実に失敗します。

ちなみに、追加したいのですが、夜の場合に列挙型を使用するのが適切かどうかはわかりません。一般に、列挙型によって何らかのステートメントの使用が強制される場合switch、それはコードの匂いであり、代わりに列挙型をクラスに変更することを検討する必要があります。列挙型は、通常、単純な静的データや制限付きデータを表すために使用されます。Players列挙型ではなくクラスであるべきだと思います。次のような構造を考えてみましょう:

class Player {
    public Teams Team { get; private set; }
    public string Name { get; private set; }

    public Player(string Name, Teams team) { /* set properties */ }
}

次に、プレーヤーがありsachin = new Player("Sachin", Teams.India)ます。これにより、各プレーヤーがチームに関連付けられます。さらに、後でプレーヤーを追加したり、各プレーヤーに統計を追加したりできるため、より動的になります。

これが役立つことを願っています。良い1日を :)

于 2015-03-25T15:00:46.727 に答える