Pergunta

Eu tenho um projeto de teste de unidade para meu aplicativo usando a estrutura Dunit. Este projeto tem uma unidade cercada por um $IFDEF Para produzir resultados de teste em um arquivo XML em vez da GUI ou apenas linha de comando. XML_Output Definy é ativado alternando a configuração de compilação.

program DelphiCodeToDoc_Tests;

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

Isso funciona perfeitamente. O problema começa Quando estou adicionando uma nova unidade a este projeto A partir do IDE (uma nova unidade com 'arquivo> nova> unidade').

O projeto de teste é agora:

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

Como você vê, o teste XML_Output desapareceu ... Cada vez que estou adicionando uma unidade, o Delphi IDE exclui esse teste.

Você sabe por que e como posso evitá -lo?

Foi útil?

Solução

Somente o código que é realmente usado é compilado em seu aplicativo de qualquer maneira, então normalmente, não dói ter unidades no Uses Cláusula que não é usada.

Você pode ver todo o código vinculado ao seu aplicativo quando você executa o programa dentro do seu IDE. Você deve ver pontos azuis ao lado de todo o código compilado.

A única ressalva é que você deve verificar o initialization Seção das unidades que são preocupantes. Qualquer código que esteja na seção de inicialização é automaticamente incluído simplesmente incluindo a unidade porque qualquer código nessa seção é executado assim que o aplicativo é iniciado. Você pode adicionar sua diretiva do compilador na seção de inicialização da unidade, se necessário, para evitar que qualquer código de inicialização seja vinculado e executado.

Outras dicas

Você pode adicionar uma unidade de proxy ao programa principal para ignorar esse comportamento problemático (que muitos de nós consideramos um bug, não um recurso).

program DelphiCodeToDoc_Tests;

uses
  ...
  XMLTestRunnerProxy,  
  ...

e

unit XMLTestRunnerProxy;

interface

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

implementation

end.

Os DPRs usos A lista é gerenciada pelo IDE. Infelizmente, não há nada que você possa fazer sobre isso. Oficialmente, você não deveria colocar o IFDefs no meio dos DPRs usos Liste porque fará coisas assim, se você fizer.

O que eu faria é deixar a unidade xmltestUnner2 no projeto e colocar os ifdefs dentro da própria unidade, para que, se você não tiver um conjunto de XML_Output, ele não compila nada.

A remoção ocorre sempre que o IDE precisar modificar a cláusula de usos do DPR. Usar "Salvar como" para renomear uma unidade fará a mesma coisa.

Para contorná -lo, sempre crio minhas novas unidades externamente como um arquivo de texto vazio e as adiciono ao DPR manualmente. É um pouco mais de trabalho inicialmente, mas você acaba incluindo apenas as unidades, se necessário. Observe também que, quando isso acontecer se você estiver usando algo mais tarde que o Delphi 2005, você poderá mudar para a guia "Histórico" na parte inferior do painel de edição e copiar o conteúdo do "arquivo local" para obter a versão antes de quando a unidade foi adicionado e tudo mais despojado.

E sim, isso é um bug. QC#6294 Especificamente, e está aberto, então Embarcadero está ciente do problema.

Considere ter dois projetos. Uma vez com o código opcional, um sem. Em seguida, construa o que quiser, ou ambos. Usando grupos de projeto, eles funcionarão bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top