Предположим, у меня есть частная процедура, которая выполняет некоторые вычисления:
private function TCar.Speed: float
{
Result = m_furlogs * 23;
}
Но теперь я хочу начать более тщательное тестирование этих вычислений, поэтому я реорганизую их в отдельную функцию:
public function TCar.Speed: float
{
Result = CalculateSpeed(m_furlogs);
}
private function TCar.CalculateSpeed(single furlogs): float
{
Result = furlogs * 23;
}
Теперь я могу выполнять все виды тестов на CalculateSpeed
:
Check( CalculateSpeed(0) = 0);
Check( CalculateSpeed(1) = 23);
Check( CalculateSpeed(2) = 46);
Check( CalculateSpeed(88) = -1);
За исключением того, что я не могу выполнить эти тесты, потому что CalculateSpeed
является приватным для TCar
.Абстрактной тенденцией модульного тестирования является то, что вы никогда не тестируете закрытый код - только общедоступные интерфейсы.На практике * x * Unit обычно не структурирован, чтобы иметь возможность доступа к закрытым методам отдельного тестируемого класса.
Проблема в том, что ни один из остальных классов не настроен для обработки юнит-тестов.Это самая первая процедура, которая будет проходить тестирование любого рода.И очень сложно настроить хост-класс набором начальных условий, которые позволят мне тестировать вызов CalculateSpeed
с каждым набором входных данных, которые мне нужны.
Единственная альтернатива, которую я вижу, - это перемещениеэто частное вычисление в свой собственный TCarCalculateSpeed
класс:
public class TCarCalculateSpeed
{
public function CalculateSpeed(float furlogs)
{
Result = furlogs * 23;
}
}
Целый класс, посвященный раскрытию одного метода, который должен быть закрытым, просто чтобы я мог его проверить?
Класс взрыва.
Плюс это личное.Если бы я хотел, чтобы он был общедоступным, я бы предпочел повысить его до public visibility - по крайней мере, таким образом я сохраню отдельный создаваемый класс.-тестирование;но это может быть сделано только небольшими частями, так как код изменяется.я не могу полностью перестроить функционирующее 12-летнее программное обеспечение, возможно, сломав все, потому что я хотел проверить один внутренний расчет.
Моя текущая, лучшая мысль - добавить Test
метод к моему Car
класс, и просто назовите это:
TCar Car = new TCar();
Car.RunTests;
public procedure TCar.RunTests
{
Check( CalculateSpeed(0) = 0);
Check( CalculateSpeed(1) = 23);
Check( CalculateSpeed(2) = 46);
Check( CalculateSpeed(88) = -1);
}
Но теперь я должен выяснить, как заставить TCar.RunTests
быть запущенным внешним TestRunner
, который предназначен только для использования TestCase
классов.
Примечание: Я пытался сделать все возможное, чтобы смешать синтаксис из нескольких языков.Другими словами: языковая независимость.