Депрессия в ответах огромна ... Но не бойтесь, у нас есть священная книга для изгнания демонов устаревшего кода C ++. Серьезно, просто купите книгу, если вы уже больше недели боретесь с унаследованным кодом C ++.
Перейдите на страницу 127: Случай с ужасными зависимостями include. (Теперь я не нахожусь даже в нескольких километрах от Майкла Фезерса, но здесь ответ настолько краткий, насколько я мог бы справиться ...)
Проблема: в C ++, если классу A нужно знать о классе B, объявление класса B напрямую поднимается / текстуально включается в исходный файл ClassA. А поскольку мы, программисты, любим доводить дело до крайности, файл может рекурсивно включать миллионы других транзитивно. На постройку уходят годы ... но, по крайней мере, она строится ... мы можем подождать.
Сказать, что «создать экземпляр ClassA с помощью тестовой оснастки сложно» - значит ничего не сказать. (Цитируя пример MF: Scheduler - это наш постер с изобилием проблемных детей.)
#include "TestHarness.h"
#include "Scheduler.h"
TEST(create, Scheduler) // your fave C++ test framework macro
{
Scheduler scheduler("fred");
}
Это приведет к появлению дракона включений с шквалом ошибок сборки.
Удар №1: терпение и настойчивость: принимайте каждое включение по одному и решайте, действительно ли нам нужна эта зависимость. Предположим, что SchedulerDisplay - один из них, чей метод displayEntry вызывается в ctor планировщика.
Blow # 2 Fake-it-till-you-make-it (спасибо RonJ):
#include "TestHarness.h"
#include "Scheduler.h"
void SchedulerDisplay::displayEntry(const string& entryDescription) {}
TEST(create, Scheduler)
{
Scheduler scheduler("fred");
}
И pop переходит в зависимость и включает все ее переходные элементы. Вы также можете повторно использовать методы Fake, инкапсулируя их в файл Fakes.h, который будет включен в ваши тестовые файлы.
Практика Blow # 3: это может быть не всегда так просто ... но вы получить идею. После нескольких первых поединков процесс взлома дипов станет легким и механическим.
Предостережения (я уже упоминал, что есть предостережения? :)
- Нам нужна отдельная сборка для тестовых случаев в этом файле; у нас может быть только одно определение для метода SchedulerDisplay :: displayEntry в программе. Так что создайте отдельную программу для тестов планировщика.
- Мы не нарушаем никаких зависимостей в программе, поэтому мы не делаем код более чистым.
- Эти подделки нужно поддерживать до тех пор, пока нам нужны тесты.
- Ваше чувство эстетики может быть оскорблено на время ... просто закусите губу и «потерпите нас к лучшему завтра»
Используйте эту технику для очень большого класса с серьезными проблемами зависимости. Не используйте часто или легкомысленно. Используйте это как отправную точку для более глубокого рефакторинга. Со временем эту программу тестирования можно будет отложить, поскольку вы извлекаете больше классов (С их собственными тестами).
Для получения дополнительной информации ... прочтите, пожалуйста, книгу. Бесценно. Сражайся, братан!
person
Gishu
schedule
15.09.2008