Googlemock: Как проверить элементы в массиве в объекте? - PullRequest
3 голосов
/ 25 февраля 2011

У меня небольшой класс:

struct Command
{
    uint8_t cmdId;
    uint8_t len;
    uint8_t payload[MAX_PAYLOAD];
};

И я хочу проверить только первые два элемента полезной нагрузки, используя ожидание googlemock.Я не могу использовать ElementsAreArray, потому что он проверяет, что длина полезной нагрузки и ожидания одинаковы.Пока у меня есть ожидание, которое выглядит так:

Command cmd;
cmd.cmdId = 0xD3;
cmd.len = 2;
cmd.payload[0] = 'm';
cmd.payload[1] = 'l';

EXPECT_CALL(mockQueue,
        sendFromIsr(Pointee(AllOf(
                Field(&Command::cmdId, Eq(0xD3)),
                Field(&Command::len, Eq(2)),
                //Field(&BirdCommand::payload, ElementsAreArray(cmd.payload, 2)) !<-- Doesn't work
        ))))
        .WillOnce(Return(true));

Есть идеи?Ложный класс выглядит так:

template <typename T>
class MockQueue : public Queue<T>
{
public:
    MOCK_METHOD1_T(sendFromIsr, bool(T &item));
};

Ответы [ 3 ]

2 голосов
/ 28 февраля 2011

Я получил это решение от Петра Горака через список рассылки googlemock, обсуждение здесь .

MATCHER_P2(CheckFirstTwo, first, second, "Checks the first two elements of an array")
{
    return arg[0] == first && arg[1] == second;
}

И в тесте я проверяю так:

EXPECT_CALL(mockQueue, sendFromIsr(
        Pointee(AllOf(
            Field(&BirdCommand::cmdId, Eq(0xD3)),
            Field(&BirdCommand::len, Eq(2)),
            Field(&BirdCommand::payload, CheckFirstTwo('m', 'l'))
        ))
));

Мне больше всего нравится это решение, потому что оно не требует от меня чрезмерной спецификации теста или нулевой инициализации структуры данных в моем производственном коде.

2 голосов
/ 25 февраля 2011

Что не так с этим:

EXPECT_CALL( mockQueue, sendFromIsr( Ref( cmd ) )
        .WillOnce( Return( true ) );

?

Поскольку команда представляет собой POD, она должна работать, даже если она копирует команду (чего в этом случае нет).


РЕДАКТИРОВАТЬ

Поскольку команда представляет собой POD, ее необходимо инициализировать нулями (или очистить память, занимаемую таким объектом, при его создании. ВВаш пример:

Command cmd = Command();

Тогда ваш объект не будет неинициализирован и сравнение не должно завершиться ошибкой.

0 голосов
/ 25 февраля 2011

Вы пробовали

EXPECT_CALL(mockQueue,
        sendFromIsr(Pointee(AllOf(
                Field(&Command::cmdId, Eq(0xD3)),
                Field(&Command::len, Eq(2)),
                Field(&Command::payload[0], Eq('m')),
                Field(&Command::payload[1], Eq('l'))
        ))))
        .WillOnce(Return(true));
...