2014-01-09 5 views
0

В официальной версии 3.1 Hippomocks (https://www.assembla.com/spaces/hippomocks/wiki/Home) там раньше было MockRepository::ClassMock построивший издевались объектов (вопреки MockRepository::InterfaceMock, не), которая может быть очень полезна при работе с методы не виртуального класса.эквивалент Hippomocks' ранее существовавшие MockRepository :: ClassMock

Текущая версия MockRepository::Mock делает то, что MockRepository::InterfaceMock сделал по-моему. Есть ли возможность построить издевательские объекты с текущей версией?

Обоснование того, что я не принимаю версию 3.1: Мне нужен также очень полезный ExpectCallFunc для тестирования функций, которые не относятся к классам, которые были введены позже.

Обоснование нецелевого использования нового места размещения: новое место размещения создало бы объект после того, как он был посмеян с помощью Hippomocks, таким образом, «сбросив» таблицу виртуальных функций, ранее измененную Hippomocks.

ответ

2

Нет, нет. Теперь вы можете издеваться над методами и членами, которые, насколько я могу судить, должны охватывать все случаи, когда вашему классу нужно что-то существовать. Вы должны использовать MockRepository::MemberMock(obj, &Class::iValue) для инициализации члена.

Если вам действительно нужно ClassMock, то, вероятно, лучше всего сначала подумать, зачем вам это нужно; в чистом TDD это никогда не нужно, поэтому есть что-то, что может потребоваться рефакторинг, чтобы избежать этой ситуации. Опять же, вы также можете использовать backport ExpectCallFunc; это довольно раздельная функциональность, поэтому она должна быть достаточно обратной. Если вы это сделаете, возьмите текущую версию git от Github, поскольку она проверила метод C, высмеивающийся для Linux/Windows/Mac X86 и X86-64 и Raspbian/ARM.

+0

Текущая версия Hippomocks не содержит никакого метода 'MemberMock'. Он содержит 'MockRepository :: Member', синтаксис которого мне не удается расшифровать, особенно параметр шаблона' class B' в 'template void Member (A * mck, CB :: * член) '. –

+0

В соответствии с чистой TDD я полностью согласен, но я использую стороннее программное обеспечение, которое я не смогу изменить в ближайшей перспективе. –

+0

Ааа ... этот синтаксис немного запутан. Первый аргумент - это объект, второй - адрес члена. A - ваш класс, C - класс члена, а B - фактический класс владельца C (который может отличаться от A, и указывается по-разному, чтобы мы могли затем преобразовать указатель, чтобы получить надлежащее смещение базы). Вы должны иметь возможность указать 'Member (obj, & Class :: iValue);' для его инициализации. После этого он полностью инициализируется и может использоваться, поэтому вы сможете просто назначить его после. – dascandy