Как использовать testing::_ в EXPECT_CALL, исключая 2 значения?

#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 . Ожидания всегда рассматриваются в обратном порядке, чем они были объявлены (поэтому сначала проверяется последнее объявленное ожидание). Это похоже на то, что позволяет создавать общие ожидания в тестовом приборе и конкретные ожидания в теле теста.