Domanda

Ho un progetto di test Unità per la mia applicazione utilizzando il framework dunit. Questo progetto ha un'unità circondato da un $IFDEF di uscita provini risultati in un file XML al posto della gui o solo linea di comando. XML_OUTPUT definire è abilitata commutando la configurazione costruzione.

program DelphiCodeToDoc_Tests;

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

Questo funziona perfettamente. Il problema inizia quando si aggiunge una nuova unità a questo progetto dal IDE (una nuova unità con 'File> Nuovo> Unità').

Il progetto di test è ora:

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

Come si vede, il XML_OUTPUT prova è scomparso ... Ogni volta che io sono l'aggiunta di un'unità, Delphi elimina questo test.

Lo sai perché e come posso evitarlo?

È stato utile?

Soluzione

Solo codice che viene effettivamente utilizzato è compilato nella vostra applicazione in ogni caso, così normalmente, non fa male ad avere unità nella clausola Uses che non vengono utilizzati.

Si può vedere tutto il codice che è collegato nella vostra applicazione quando si esegue il programma all'interno del vostro IDE. Si dovrebbe vedere puntini blu accanto a tutto il codice compilato.

L'unica avvertenza è che si dovrebbe verificare la sezione initialization delle unità che sono di preoccupazione. Qualsiasi codice che si trova nella sezione di inizializzazione viene incluso automaticamente semplicemente inserendo l'unità perché qualsiasi codice in tale sezione viene eseguito non appena l'applicazione viene avviata. Si potrebbe aggiungere la tua direttiva del compilatore all'interno della sezione di inizializzazione del gruppo, se necessario, per evitare qualsiasi codice di inizializzazione di essere collegato in e corse.

Altri suggerimenti

È possibile aggiungere un'unità di proxy per il programma principale per aggirare questo comportamento problematico (che molti di noi considerano un bug, non è una caratteristica).

program DelphiCodeToDoc_Tests;

uses
  ...
  XMLTestRunnerProxy,  
  ...

e

unit XMLTestRunnerProxy;

interface

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

implementation

end.

del DPR usi è gestito dalla IDE. Purtroppo, non c'è niente che si può fare su questo. Ufficialmente, non dovresti mettere IFDEFs nel mezzo della usi del DPR lista perché farà cose come questa se lo fai.

Quello che mi piacerebbe fare è lasciare l'unità XmlTestRunner2 nel progetto, e mettere le IFDEFs all'interno dell'unità stessa in modo che, se non si dispone di set XML_OUTPUT, non compilare nulla.

La spoliazione verifica ogni volta che l'IDE ha di modificare del DPR USI clausola. L'utilizzo di "Salva con nome" per rinominare un'unità farà la stessa cosa.

Per ovviare a ciò ho sempre creare le mie nuove unità esternamente come un file di testo vuoto e poi aggiungerli al DPR manualmente. E 'un po' più di lavoro inizialmente, ma si finisce solo comprese le unità se sono necessari. Si noti inoltre che quando questo accade se si sta utilizzando niente più tardi Delphi 2005 è possibile passare alla scheda "Cronologia" nella parte inferiore del riquadro di modifica e copiare i contenuti "file locale" per ottenere la versione prima di quando l'unità è stata aggiunta e tutto il resto messo a nudo.

E sì, questo è un bug. QC # 6294 specifico, ed è aperto, in modo Embarcadero è consapevole della questione.

Si consideri di avere due progetti. Una volta con il codice facoltativo, uno senza. Poi costruire a seconda di quale si vuole, o entrambi. Utilizzando gruppi di progetto, lavoreranno bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top