C #, NUnit: как бороться с тестированием исключений и отложенным выполнением - PullRequest
5 голосов
/ 11 января 2010

Скажем, у нас есть метод, который выглядит следующим образом:

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

1 Ответ

3 голосов
/ 11 января 2010

Тест в порядке - ваш код - нет. Вы должны заставить код генерировать исключение сразу после его вызова, разделив метод пополам:

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();
}
...