Скажите, что у нас есть метод, который похож на это:
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
Тест в порядке - ваш код не. Вы должны заставить код бросить исключение, как только он вызывается, расщепляя метод пополам:
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();
}