C#, NUnit: Как иметь дело с тестированием исключений и задержанного выполнения

Скажите, что у нас есть метод, который похож на это:

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 метод, и это перестало работать даже без a ToArray или что-либо как этот, так по-видимому, существует что-то, что можно делать с этим... Я просто не знаю что :p

5
задан Svish 11 January 2010 в 13:26
поделиться

1 ответ

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

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();
}
3
ответ дан 15 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: