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