В [первоначальному] принят ответ указал ваш фактический сценарий сводится к collection.Sum()
однако вы не сможете уйти с этим каждый раз.
Если мы используем TDD для разработки этого (избыточно я согласен, но легко объяснить) мы бы [возможно] сделать следующее (я также использую NUnit в данном примере из предпочтения)
[Test]
public void Sum_Is_Zero_When_No_Entries()
{
var bomManager = new BomManager();
Assert.AreEqual(0, bomManager.MethodToTest(new Collection<int>()));
}
, а затем напишите следующий код (примечание: мы пишем минимум для соответствия текущему набору тестов)
public int MethodToTest(Collection<int> collection)
{
var sum = 0;
return sum;
}
Мы тогда напишем новый тест, например,
[Test]
[TestCase(new[] { 0 }, 0)]
public void Sum_Is_Calculated_Correctly_When_Entries_Supplied(int[] data, int expected)
{
var bomManager = new BomManager();
Assert.AreEqual(expected, bomManager.MethodToTest(new Collection<int>(data)));
}
Если мы провели наши тесты они все проходят (зеленый), поэтому нам нужно новое испытание (случаи)
[TestCase(new[] { 1 }, 1)]
[TestCase(new[] { 1, 2, 3 }, 6)]
Для того, чтобы удовлетворить эти тесты я должен был бы изменить свой код, например,
public int MethodToTest(Collection<int> collection)
{
var sum = 0;
foreach (var value in collection)
{
sum += value;
}
return sum;
}
Теперь все мои тесты работают, и если я бегу, что через opencover я получаю 100% последовательность и охват ветви - ура .... И я сделал это без покрытия, как мой контроль, но писать правильные тесты для поддержите мой код.
НО есть «возможный» дефект ... что, если я перехожу в null
? Время для нового теста для исследования
[Test]
public void Sum_Is_Zero_When_Null_Collection()
{
var bomManager = new BomManager();
Assert.AreEqual(0, bomManager.MethodToTest(null));
}
Тест не проходит, поэтому нам необходимо обновить наш код, например.
public int MethodToTest(Collection<int> collection)
{
var sum = 0;
if (collection != null)
{
foreach (var value in collection)
{
sum += value;
}
}
return sum;
}
Теперь у нас есть тесты, которые поддерживают наш код, а не тесты, которые проверяют наш код, т.е.наши тесты не заботятся о том, как мы писали наш код.
Теперь у нас есть хороший набор тестов, поэтому мы теперь можем безопасно реорганизовать наш код, например.
public int MethodToTest(IEnumerable<int> collection)
{
return (collection ?? new int[0]).Sum();
}
И я сделал это, не затрагивая ни одного из существующих тестов.
Надеюсь, это поможет.
вместо написания foreach вы не могли бы использовать метод расширения коллекции 'foreach' и создать делегат? [Список .foreach] (http://msdn.microsoft.com/en-us/library/bwabdf9z (v = vs.110) .aspx) –
MethodMan
Я запускаю образец кода с другим инструментом покрытия кода (DotCover) и я получил 100% -ный охват кода. Может быть, что 'sum + = value;' не включается, потому что код оптимизирован и не учитывается вашим инструментом покрытия? Добавление оператора 'Debug.WriteLine (sum);' могло бы помочь в этом случае. – Sjips
OpenCover смотрит на IL, созданный с помощью компиляции кода, и иногда компилятор добавляет больше инструкций IL, чем вы можете сопоставить свой код, поэтому это затрудняет получение покрытия на 100% с OpenCover. Иногда команда будет искать оптимизацию, но не часто (я добавлю это в список кандидатов). –