Единственный способ добиться прохождения теста — вручную указать каждую итерацию, например
Код: Выделить всё
EXPECT_CALL(mock, Read(address)).Times(5)
.WillOnce(Return(0))
.WillOnce(Return(0))
.WillOnce(Return(0))
.WillOnce(Return(0))
.WillOnce(Return(1));
Тестируемый код использует слово состояния, чтобы определить, цикл чтения данных должен завершиться. EXPECT_CALL должен установить ожидание возврата 1 из имитируемого метода Read() N раз, а в N-м цикле вернуть 0, чтобы указать, что данных больше нет.
К сожалению, рассматриваемый код находится на отдельной машине, но вот показательный пример.
Код: Выделить всё
const unsigned int statusAddress = 0;
const unsigned int dataAddress = 1;
const unsigned int maxData = 8;
unsigned int dataBuffer[maxData] = {0};
int readIndex = 0;
// Check if data is available (read returns 1).
unsigned int dataIsAvailable = Read(statusAddress);
// Keep reading data until no more is available or the buffer is full.
while ((dataIsAvailable == 1) && (readIndex < maxData))
{
// Read data word.
dataBuffer[readIndex++] = Read(dataAddress);
// Read status to determine if more data is available.
dataIsAvailable = Read(statusAddress);
}
Если я добавляю ожидания по порядку, используется последний EXPECT_CALL (я предположим, что WillOnce перезаписывает WillRepeatedly в коде Google). Очевидно, я неправильно понимаю, как упорядочиваются несколько EXPECT_CALL.
Код: Выделить всё
EXPECT_CALL(mock, Read(address)).Times(4).WillRepeatedly(Return(1));
EXPECT_CALL(mock, Read(address)).Times(1).WillOnce(Return(0));
Код: Выделить всё
Expected: to be called 4 times
Actual: never called - unsatisfied and active
Код: Выделить всё
WillN(Return(1), 4)
Подробнее здесь: https://stackoverflow.com/questions/559 ... xit-a-loop