#c #googletest
#c #googletest
Вопрос:
У меня есть метод, который внутри вызывает метод, который возвращает значение bool — в этом вопросе давайте назовем метод:
bool IsFilled(int value)
Теперь в другом методе, который я тестирую, это вызывается несколько раз:
if (IsFilled(0))
{
if (IsFilled(1)){
...
} else {
...
}
}
for (int i = 1; i < range; i )
{
if (IsFilled(i)) {
...
if (IsFilled(0)) {
}
}
}
Теперь, как бы правильно протестировать его с помощью gtest? Я в основном ищу покрытие и тестирую ветви больше, чем значения. Таким образом, я ожидал сделать что-то вроде этого:
EXPECT_CALL(adapter, IsFilled(0)).Times(zeroCalls).WillOnce(IndexZeroResults);
EXPECT_CALL(adapter, IsFilled(1)).Times(oneCalls).WillOnce(IndexOneResults);
EXPECT_CALL(adapter, IsFilled(_)).Times(otherCalls).WillOnce(IndexOtherResults);
Мне нужно, чтобы вызовы 0/1 были разделены, так как тогда я могу протестировать все ветви, однако «_» будет дублировать вызовы 0/1 при тестировании со случайными значениями. Возможно ли это исключить?
Ответ №1:
TL;DR — поменять местами порядок EXPECT_CALL
s:
EXPECT_CALL(adapter, IsFilled(_)).Times(otherCalls).WillOnce(IndexOtherResults);
EXPECT_CALL(adapter, IsFilled(1)).Times(oneCalls).WillOnce(IndexOneResults);
EXPECT_CALL(adapter, IsFilled(0)).Times(zeroCalls).WillOnce(IndexZeroResults);
Это работает из-за правил GoogleMock для упорядочения EXCEPT_CALLs . Ожидания всегда рассматриваются в обратном порядке, чем они были объявлены (поэтому сначала проверяется последнее объявленное ожидание). Это похоже на то, что позволяет создавать общие ожидания в тестовом приборе и конкретные ожидания в теле теста.