Как я могу проверить функции и процедуры, поскольку они не принадлежат классам в Delphi?

У меня есть несколько маленьких функций в старом модуле под названием Utils.pas,

Теперь я хотел бы провести рефакторинг некоторых из них, но я думаю, что лучше написать тест раньше. С DUnit я думаю, что это невозможно без класса.

Итак, я хотел бы знать, как я могу проверить их перед рефакторингом?

Редактировать:

Я думал, что это невозможно, потому что я пытался добавить тестовый пример в Delphi, используя Test Case Wizard. Посмотрите на картинку ниже, где нет никаких классов и методов, поэтому я не смогу ее создать.

3 ответа

Решение

Вы не можете протестировать автономную функцию с помощью мастера, но это не проблема для тестирования автономной функции с помощью DUnit.

пример

  //***** A Standalone function te be tested in a unit far, far away
  function Add(v1, v2: Integer): Integer;
  ...

  //***** A testclass to contain the testmethods calling our 
  //      standalone function     
  TTestAdd = class(TTestcase)
  published
    procedure AddingComplement_ShouldEqualZero;
    procedure AddingNegativeNumbers_ShouldBeLessThanZero
    ...
  end;

  implementation

  procedure TTestAdd.AddingComplement_ShouldEqualZero;
  begin
    // Setup, Execute & Verify
    CheckEquals(0, Utils.Add(-1, 1), 'Complement doesn''t add to zero');
  end;

  procedure TTestAdd.AddingNegativeNumbers_ShouldBeLessThanZero
  begin
    // Setup, Execute & Verify
    CheckEquals(-3, Utils.Add(-1, -2), 'Add doesn''t add');
  end;

AFAICT, DUnit не требует, чтобы тестируемый код существовал как методы класса. Только сами тесты должны быть классами.

РЕДАКТИРОВАТЬ: Мастер просто удобство. Вы не должны использовать это.

Реальный код должен быть сохранен. В реальном коде есть предположения, которые плохо документированы. Реальный кодекс изменяется людьми, которые забывают или никогда не знали этих предположений. Доверяйте тестам, не доверяйте коду.

Реальный TDD позволяет создавать объект и его методы перед реализацией. Вам все равно нужна четкая модель, прежде чем вы сможете написать контрольный пример.

Так что сгенерируйте объект (ы), добавьте методы, параметры и т. Д. Вероятно, лучше всего было бы использовать UML2, затем написать тестовые сценарии для них и затем реализовать объекты. После этого запустите профилировщик и выясните, насколько ужасен ваш код, и выполните рефакторинг.

В качестве общего решения почти всегда лучше написать фабричный объект для создания экземпляров и инициализации ваших объектов. Чем ближе вы подходите к основной функциональности, тем больше это становится важным.

Напишите тесты для ожидаемых отказов и исключений. используйте чек, чтобы убедиться.

Наконец напишите каждый тест и посмотрите, как он провалится, прежде чем писать код, чтобы он был успешным.

Другие вопросы по тегам