Насмешка невиртуальных методов в C++, не редактируя производственный код?

Я - довольно новый разработчик программного обеспечения, в настоящее время работающий, добавляя модульные тесты к существующему проекту C++, который запустился несколько лет назад. Из-за нетехнической причины, мне не разрешают изменить существующий код. Базовый класс всех моих модулей имеет набор методов для Установки/Получения данных и общения с другими модулями.

Так как я просто хочу к поблочному тестированию каждый отдельный модуль, я хочу быть в состоянии использовать консервированные значения для всех своих межмодульных способов связи. Т.е. для метода Ping (), который проверяет, активен ли другой модуль, я хочу иметь его, возвращают TRUE или FALSE на основе того, какой тест я делаю. Я изучал Google Test и Google Mock, и он действительно поддерживает дразнящие невиртуальные методы. Однако подход, описанный (http://code.google.com/p/googlemock/wiki/CookBook#Mocking_Nonvirtual_Methods), требует меня к "templatize" исходные методы взять или в реальных или в фиктивных объектах. Я не могу пойти и templatize мои методы в базовом классе из-за требования, упомянутого ранее, таким образом, мне нужен некоторый другой способ дразнить эти виртуальные методы

В основном методы, которые я хочу дразнить, находятся в некотором базовом классе, модули я хочу к модульному тесту и создаю насмешки для, производные классы того базового класса. Существуют промежуточные модули, промежуточные мой основной класс Модуля и модули, которые я хочу протестировать.

Я ценил бы, любой советует!

Спасибо,

JW

Править: Более конкретные примеры

Мой базовый класс, позволяет, говорят, что rootModule, модуль, который я хочу протестировать, является leafModule. Существует промежуточный модуль, который наследовался rootModule, leafModule наследовался этому промежуточному модулю.

В моем leafModule я хочу протестировать doStuff () метод, который называет не виртуальный GetStatus (moduleName) определенным в rootModule классе. Я должен так или иначе сделать GetStatus () для возврата выбранного консервированного значения. Насмешка плохо мне знакома, настолько использующие фиктивные объекты являются даже правильным подходом?

19
задан wk1989 26 February 2010 в 05:32
поделиться

3 ответа

Попробуйте выполнить следующие действия: http://jsbin.com/okigi/3/edit (редактирование: изменение тэга формы на div, чтобы пример нигде не накапливался)

function process() {

    entered = $('#content').val();
    lines = entered.split(/\n/);
    opttext = ""; for(var i in lines) {
      opttext += "<option>" + lines[i] + "</option>";
    }
    $('#myform').append("<select>"+opttext+"</select>");
}

$(document).ready(function() {
    $("#process").bind('click', process);
});

<FORM id="myform" action="" method="">
     <p><LABEL for="content">Paste Code Here: </LABEL></p>
     <p><textarea id="content" cols="40" rows="10"></textarea></p>
     <button id="process">Go!</button>
</FORM>

Это не удаляет дубликаты, или не помещает их в алапхабетический порядок, но как только у вас есть строки в массиве «строки», вы можете понять, как делать эти вещи самостоятельно.

-121--3390888-

Проблема, с которой вы сталкиваетесь здесь, называется той же самой политикой происхождения , в которой говорится, что GroupStartRequests должен быть в том же домене, в котором запущен сценарий. Если вам нужно сделать это через AJAX, он должен будет отправить в скрипт, работающий на вашем домене, который затем сделает вызов SalesForce.

-121--4716186-

Я бы написал сценарий Perl/Ruby/Python для чтения в исходном исходном дереве и записи издевательского исходного дерева в другом каталоге. Нет необходимости полностью анализировать C++, чтобы заменить определение функции.

3
ответ дан 30 November 2019 в 04:59
поделиться

Как правило, не обрабатывайте закодированные байтестринги: преобразуйте их в соответствующие последовательности Юникода (вызвав их метод .decode ) как можно скорее, всегда выполняйте обработку на последовательности Юникода, затем, если необходимо для целей ввода-вывода, .encode их обратно в любую кодировку байтестринга, которую требуется

Если вы говорите о литералах, как кажется, вы находитесь в вашем коде, «как можно скорее» будет сразу : используйте u '...' , чтобы выразить ваши литералы. В более общем случае, когда вы вынуждены выполнять операции ввода-вывода в кодированной форме, это происходит сразу после ввода (так же, как и непосредственно перед выводом, если необходимо выполнить вывод в конкретной кодированной форме).

-121--2766331-

Можно кодировать mp3 для swf . Пользователи могут загрузить swf, но не могут загрузить его в своем ipod, если это ваша проблема.

(Ссылка на коммерческий продукт, который я нашел с помощью google, но, вероятно, есть свободные альтернативы)

-121--4028612-

Один из подходов заключается в определении различных источников для тестирования. Предположим, что производственная цель использует rootModule.h и rootModule.cpp . Используйте различные источники для тестовой цели. Можно указать другой заголовок путем изменения пути включения, так что # include «rootModule.h» фактически загружает unittest/rootModule.h . Затем имитируйте rootModule для содержимого вашего сердца.

2
ответ дан 30 November 2019 в 04:59
поделиться

Есть несколько разных способов замены не виртуальных функций. Один из них - повторно объявить их и скомпилировать новый тестовый исполняемый файл для каждого другого набора невиртуальных функций, которые вы хотите протестировать. Это вряд ли масштабируемо.

Второй вариант - сделать их виртуальными для тестирования. Большинство компиляторов позволяют вам определять что-то в командной строке, поэтому скомпилируйте свой код с -DTEST_VIRTUAL = virtual или -DTEST_VIRTUAL, чтобы сделать их виртуальными или нормальными в зависимости от того, тестируется он или нет.

Третий вариант, который можно использовать, - это использовать фреймворк имитации, который позволяет имитировать невиртуальные функции. Я автор HippoMocks (отказ от ответственности в отношении нейтралитета и т. Д.), И недавно мы добавили возможность имитировать простые функции C на платформах X86. Это может быть распространено на невиртуальные функции-члены с небольшой работой, и это будет то, что вы ищете. Имейте в виду, что, если ваш компилятор может одновременно видеть и использование, и определение функции, он может встроить ее и что насмешка может завершиться ошибкой.Это, в частности, относится к функциям, определенным в заголовках.

Если вам достаточно обычного имитации функций C, вы можете использовать его как есть сейчас.

13
ответ дан 30 November 2019 в 04:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: