2010-03-31 2 views
4

У меня есть проект тестирования модуля для моего приложения с использованием структуры DUnit. Этот проект имеет блок, окруженный $IFDEF, для вывода результатов теста в xml-файл вместо gui или только командной строки. Определение XML_OUTPUT включено путем переключения конфигурации сборки.Почему «использование единицы» исчезает, когда у меня появился новый блок?

program DelphiCodeToDoc_Tests; 

uses 
    TestFramework, 
    TextTestRunner, 
    Sysutils, 
    Forms, 
    GUITestRunner, 
{$IFDEF XML_OUTPUT} 
    XmlTestRunner2 in 'DUnit_addon\XmlTestRunner2.pas', 
{$ENDIF} 
    DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas', 
    ... 

Это прекрасно работает. Проблема начинается с , когда я добавляю новое устройство к этому проекту из IDE (новый блок с «Файл> Создать> Единица»).

Испытательный проект сейчас:

uses 
    TestFramework, 
    TextTestRunner, 
    Sysutils, 
    Forms, 
    GUITestRunner, 
    DCTDSetupTests in 'IntegrationTests\DCTDSetupTests.pas', 
    ... 
    MyNewUnit in 'IntegrationTests\MyNewUnit.pas'; 

Как вы видите, тест XML_OUTPUT исчез ... Каждый раз, когда я добавляю блок, Delphi IDE удаляет этот тест.

Знаете ли вы, почему и как я могу избежать этого?

ответ

5

В любом случае в ваше приложение скомпилировано только код, поэтому, как правило, не помешает иметь единицы в условии Uses, которые не используются.

Вы можете увидеть весь код, связанный с вашим приложением, когда вы запускаете программу в своей среде IDE. Вы должны увидеть синие точки рядом со всем скомпилированным кодом.

Осторожно, что вы должны проверить раздел initialization единиц, вызывающих озабоченность. Любой код, который находится в разделе инициализации, автоматически включается простым включением устройства, потому что любой код в этом разделе запускается, как только приложение запускается. Вы можете добавить свою директиву компилятора в разделе инициализации устройства, если это необходимо, чтобы избежать привязки и запуска кода инициализации.

+0

Поскольку у 'XmlTestRunner2' нет кода инициализации, а не на единичных тестовых файлах, я могу определенно добавить этого слушателя в список использования. Он будет связан только при вызове позже, в зависимости от конфигурации сборки. ** Итак, Маркус, так решил мою проблему! ** В другой ситуации я бы применил метод 'proxy unit' от' gabr'. – TridenT

5

DDR использует список принадлежит IDE. К сожалению, вы ничего не можете с этим поделать. Официально, вы не должны помещать IFDEF в середине DDR использует список, потому что он будет делать такие вещи, как если бы вы это делали.

Что бы я сделал, это оставить объект XmlTestRunner2 в проекте и поместить IFDEF внутри самого устройства, чтобы, если у вас нет установленного XML_OUTPUT, он ничего не компилирует.

+0

Я не хочу менять устройство, добавляя внутрь IFDEF. См. Это как стороннее устройство. Ваша идея хороша, но мне это не нравится :) – TridenT

7

Вы можете добавить прокси-блок в основную программу, чтобы обойти это проблемное поведение (которое многие из нас считают ошибкой, а не функцией).

program DelphiCodeToDoc_Tests; 

uses 
    ... 
    XMLTestRunnerProxy, 
    ... 

и

unit XMLTestRunnerProxy; 

interface 

{$IFDEF XML_OUTPUT} 
uses 
    XmlTestRunner2 in 'DUnit_addon\XmlTestRunner2.pas'; 
{$ENDIF} 

implementation 

end. 
+0

Это хорошая идея, которую я должен использовать когда-нибудь. НО В этом случае я отвечу от «Marcus Adams» – TridenT

+0

+1 Было сказано, что: «Ошибка или дефект - это любое поведение, вызывающее неприятный сюрприз». Умышленный ручной код, вырванный из вашего dpr, является самым неожиданным, и не немного неприятным! –

5

Зачистки происходит каждый раз, когда IDE должен изменить положение ИСПОЛЬЗУЕТ ДПР. Использование «Сохранить как» для переименования устройства будет делать то же самое.

Чтобы обойти это, я всегда создаю свои новые юниты извне как пустой текстовый файл, а затем добавляю их в DPR вручную. Сначала это немного больше, но в конечном итоге вы включаете только единицы, если они необходимы. Также обратите внимание, что, когда это произойдет, если вы используете что-либо позже Delphi 2005, вы можете перейти на вкладку «История» в нижней части панели редактирования и скопировать содержимое «Локальный файл», чтобы получить версию до того момента, когда устройство был добавлен, и все остальное раздели.

И да, это ошибка. QC#6294 конкретно, и он открыт, поэтому Embarcadero знает об этой проблеме.

+0

Они знают об этой проблеме, но из того, что я видел, когда ее воспитывали на форумах Embarcadero, похоже, это одна из тех, «это по дизайну и, вероятно, не будет исправлена, извините» вопросы. –

+0

Я сказал Майку Розлогу, что, по-моему, он плохо отражается на поддержке рефакторинга и что он затрудняет работу с кросс-платформой, и его ответ был немного более позитивным, чем это. Я предполагаю, что чем больше они слышат такие вещи, тем больше вероятность их исправить. –

+0

спасибо за ответ и ссылку QC. Я должен был это увидеть! – TridenT

0

Рассмотрите наличие двух проектов. Один раз с дополнительным кодом, без него. Затем создайте то, что вы хотите, или и то, и другое. Используя проектные группы, они будут работать хорошо.

+0

да, но мне нужно синхронизировать два файла проекта. Даже если я не буду изменять его очень часто, будет случай, когда вы не синхронизированы! – TridenT

Смежные вопросы