5

次のようなメソッドがあるとします。

public IEnumerable<Dog> GrowAll(this IEnumerable<Puppy> puppies)
{
    if(subjects == null)
        throw new ArgumentNullException("subjects");

    foreach(var puppy in puppies)
        yield return puppy.Grow();
}

私がこれを行うことによってそれをテストする場合:

Puppy[] puppies = null;
Assert.Throws<ArgumentNullException>(() => puppies.GrowAll());

テストはそれを言って失敗します

期待:<System.ArgumentNullException>
しかしだった: null

テストを次のように変更することで修正できます

Puppy[] puppies = null;
Assert.Throws<ArgumentNullException>(() => puppies.GrowAll().ToArray());

これはあなたが通常それをする方法だけですか?それとも、テストを書くためのより良い方法はありますか?それとも、メソッド自体を書くためのより良い方法ですか?


Select組み込みのメソッドで同じことをしようとしましたが、それがなくても失敗しToArrayたので、どうやらそれについて何かできることがあるようです...私は何を知っているのかわかりません:p

4

1 に答える 1

3

テストは問題ありません-コードは問題ありません。メソッドを半分に分割して、コードが呼び出されるとすぐに例外をスローするようにする必要があります。

public IEnumerable<Dog> GrowAll(this IEnumerable<Puppy> puppies)
{
    if(subjects == null)
        throw new ArgumentNullException("subjects");

    return GrowAllImpl(puppies);
}

private IEnumerable<Dog> GrowAllImpl(this IEnumerable<Puppy> puppies)
{
    foreach(var puppy in puppies)
        yield return puppy.Grow();
}
于 2010-01-11T13:16:43.983 に答える