Как проверить, что 2 ложных метода вызываются с одинаковой ссылкой? - PullRequest
0 голосов
/ 19 февраля 2019

Предположим, я тестирую метод, который объявляет некоторую внутреннюю переменную (в стеке).Переменная передается по ссылке на один объект (метод setupFoo()), чтобы заполнить его правильными значениями, а затем передается по ссылке на другой объект (метод useFoo()), чтобы использовать значения.

Как я могунапишите мои EXPECT_CALLs и matchers, чтобы проверить, что оба вызова к проверенным методам получают то же самое ссылку?Прямо сейчас я просто использую _, чтобы игнорировать ссылки.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Другой вариант, используя Truly() вызов:

template <class T>
struct SameReference {
    const T **ptr;
    SameReference(const T **pointer) : ptr(pointer){}
    bool operator()(const T &ref) const {
        if (*ptr == nullptr) *ptr = &ref;
        return *ptr == &ref;
    }
};

template <class T>  SameReference<T> sameReference(T *&ptr){return SameReference<T>(&ptr);}

...

const ErrorInfo *asThis = nullptr;
EXPECT_CALL(errorUtils, setupError(Truly(sameReference(asThis))));
EXPECT_CALL(responseCreator, createException(Truly(sameReference(asThis))));
0 голосов
/ 19 февраля 2019

Вы можете сделать что-то вроде:

const void* ref = nullptr;
EXPECT_CALL(mock, setupFoo(_)).WillOnce(Invoke([&](const auto& ptr) { ref = &ptr;}));
EXPECT_CALL(mock, useFoo(_)).WillOnce(Invoke([&](auto& ptr) { EXPECT_EQ(ref, &ptr);}));
...