В реальном проекте C ++ большинство методов имеют побочные эффекты, помимо возврата значения и изменения выходного параметра.
// For examle
bool A::doA()
{
bool isSuccess = true;
isSuccess &= b.doB();
isSuccess &= c.doC();
this->a++;
return isSuccess;
}
Побочные эффекты вышеупомянутого метода включают вызов 2 методов и изменение переменной-члена a.
Однако, когда пишу unittest для вышеуказанного метода, я вижу, что большинство людей просто проверяют возвращаемое значение и игнорируют побочные эффекты, которые достигают 100% покрытия кода.
Но я думаю, что такой unittest глуп по двум причинам:
1. Основная функция метода doA - это побочные эффекты, а не возвращаемое значение.
2. Если doA имеет возвращаемое значение void (что часто встречается в реальном коде), вы даже не можете написать unittest таким образом.
В Google я нашел способ протестировать побочные эффекты:
1.mock b и c и проверить, вызваны ли doB и do C.
2.check value переменной члена через некоторую технику.
Но я думаю, что такой юнит-тест не годится по двум причинам:
1. Будет так много насмешек и времени. Кроме того, кажется глупым просто проверять, вызывается ли метод.
2. Это зависит от реализации метода, а не интерфейса, если реализация изменится, нужно изменить unittest. И я слышал, кто-то говорит, что unittest должен быть тестом черного ящика.
Так как вы решаете такую проблему в реальном проекте?