Warum ‚Verwendungseinheit‘ verschwinden, wenn ich eine neue Einheit hatte?

StackOverflow https://stackoverflow.com/questions/2555259

  •  23-09-2019
  •  | 
  •  

Frage

Ich habe eine Testeinheit Projekt für meine Anwendung mit DUnit-Framework. Dieses Projekt eine Einheit von einem $IFDEF zur Ausgabe von Test-Ergebnissen in einer XML-Datei anstelle des gui oder Befehlszeile umgeben hat. XML_OUTPUT define wird aktiviert, indem die Build-Konfiguration umgeschaltet wird.

program DelphiCodeToDoc_Tests;

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

Das funktioniert perfekt. Die Ausgabe beginnt , wenn ich das Hinzufügen einer neuen Einheit zu diesem Projekt aus der IDE (eine neue Einheit mit ‚Datei> Neu> Einheit‘).

Das Testprojekt ist nun:

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

Wie Sie den Test XML_OUTPUT sehen, ist verschwunden ... Jedes Mal, wenn ich eine Einheit bin Hinzufügen von Delphi IDE löscht diesen Test.

Sie wissen, warum und wie ich es vermeiden kann?

War es hilfreich?

Lösung

Nur Code, der tatsächlich verwendet wird, wird in Ihre Anwendung kompiliert sowieso, also normalerweise, es nicht zu haben, schadet Einheiten in der Uses-Klausel, die nicht verwendet werden.

Sie können alle den Code in Ihrer Anwendung verknüpft ist, wenn Sie das Programm in Ihrem IDE ausführen. Sie sollten neben all den kompilierten Code blaue Punkte sehen.

Die einzige Einschränkung ist, dass Sie den initialization Abschnitt der Einheiten überprüfen sollten, die von Bedeutung sind. Jeder Code, der in dem Initialisierungsabschnitt ist automatisch eingeschlossen einfach durch das Gerät einschließlich weil jeder Code in diesem Abschnitt ausgeführt wird, sobald die Anwendung startet. Sie könnten Ihre Compiler-Direktive in der Initialisierungsabschnitt der Einheit hinzufügen, falls erforderlich, von jeder Initialisierungscode zu vermeiden und RAN verbunden ist.

Andere Tipps

Sie können eine Proxy-Einheit in das Hauptprogramm in der Bypass dieses problematischen Verhaltens (die viele von uns einen Fehler betrachten, kein Merkmal).

program DelphiCodeToDoc_Tests;

uses
  ...
  XMLTestRunnerProxy,  
  ...

und

unit XMLTestRunnerProxy;

interface

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

implementation

end.

Der von DPR Anwendungen Liste wird von dem IDE verwaltet. Leider gibt es nichts, was man dagegen tun kann. Offiziell sind Sie nicht die in der Mitte des DPR setzen IFDEFs soll Anwendungen Liste, weil es Sachen wie dies tun, wenn Sie tun.

Was ich tun würde, ist verläßt die XmlTestRunner2 Einheit in dem Projekt, und legen Sie den IFDEFs im Innern des Gerätes selbst, so dass, wenn Sie nicht XML_OUTPUT gesetzt haben, spielt es keine Kompilierung nichts.

auftritt Das Strippen jederzeit die IDE des uses-Klausel des DPR zu ändern haben. Mit „Speichern unter“, um eine Einheit benennen wird das gleiche tun.

Um Arbeit um es mir immer meine neue Einheiten erstellen extern als eine leere Textdatei und dann manuell auf den DPR hinzuzufügen. Es ist ein bisschen zunächst mehr Arbeit, aber Sie nur die Einheiten einschließlich am Ende, wenn sie notwendig sind. Beachten Sie auch, dass, wenn dies geschieht, wenn Sie etwas verwenden später als Delphi 2005 Sie auf die „History“ -Reiter am unteren Rand des Bearbeitungsfenster wechseln und kopieren Sie die „Lokale Datei“ Inhalt der Version vor, wenn das Gerät zu bekommen wurde zugegeben, und alles andere ausgezogen.

Und ja, das ist ein Fehler. QC speziell # 6294 , und es ist offen, so Embarcadero bewusst ist des Problems.

Betrachten wir zwei Projekte haben. Einmal mit dem optionalen Code, eine ohne. Dann bauen je nachdem, was Sie wollen, oder beides. Mit Projektgruppen, werden sie gut funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top