代码之家  ›  专栏  ›  技术社区  ›  Ozan HELPY

Delphi:如何在另一个项目中使用一个项目的所有单元和单元引用

  •  2
  • Ozan HELPY  · 技术社区  · 15 年前

    我正在为我们主项目的所有单元测试构建一个专门的项目,因为将它们包含在主项目中会对已经庞大的代码库造成压力。现在,主项目的所有单元都在项目的DPR文件中引用,并给出它们的位置。当我为一个类编写一个测试用例时,只需从主项目的DPR中复制类单元引用(以及引用的单元单元引用),并将其粘贴到单元测试项目中。

    这意味着最终我将得到一个DPR文件,其中包括所有主要项目的DPR文件单元引用,当主要项目的DPR发生变化时,将难以维护。我们说的是成千上万的单位。

    我的问题是,我是否可以在另一个项目中包含一个项目的所有单元引用?仅仅让主项目在一个目录中编译其DCU,并将其包含在单元测试项目中,DCU搜索路径是不够的,因为单元具有必须执行的初始化例程。

    3 回复  |  直到 15 年前
        1
  •  2
  •   skamradt    15 年前

    我实现这一点的方法是创建一个程序来获取现有的DPR文件,并生成一个包含文件,然后在我的测试应用程序中使用该文件。您可能可以使用tstringlist来完成大部分操作。这个项目将在构建测试用例之前运行。

    var
      OrigDpr : tStringlist;
    begin
      OrigDpr := tSTringlist.create;
      OrigDpr.LoadFromFile( originalprojectname );
      while (OrigDpr.Count > 0) and (not SameText('uses',OrigDpr.Strings[0])) do
        OrigDpr.Delete(0);
      // delete the uses line.
      if (OrigDpr.Count > 0) then
        OrigDpr.Delete(0);
      while (OrigDpr.Count > 0) and 
            (not SameText('{$R *.RES}',OrigDpr.Strings[OrigDpr.Count-1]) do
        OrigDpr.Delete(OrigDpr.Count-1);
      // delete the $R reference
      if (OrigDpr.Count > 0) then
        OrigDpr.Delete(OrigDpr.Count-1);
    
      OrigDpr.SaveToFile( 'pathtotestproject\TESTPROJECT.INC' );
    end;
    

    然后在测试DPR中,在项目use子句中添加以下代码。由于use子句include文件已经包含分号,请在常规测试单元末尾使用include文件:

    USES
      // test units go FIRST
      {$I pathtotestproject\TESTPROJECT.INC}
    

    我的假设是,您正在执行延迟/松散绑定,这就是为什么首先必须执行所有这些操作(除了DPR中的单元外,未引用其他单元)。否则,只使用任何一个单元就足以执行初始化代码。

    编辑

    另一种选择是让第一个程序生成一个完整的单元,然后在测试应用程序中使用这个单元。这将从所有引用的单元在初始化/终结代码中编译。然后,您的测试应用程序必须使用您提到的全局存储库才能访问这些对象。

    这里的一个重要部分是确保测试项目搜索路径包含其他项目的源目录。

        2
  •  2
  •   Craig Stuntz    15 年前

    不,没有办法做到这一点(好吧),但这可能无关紧要。IDE维护着DPR,它对事物的引用方式非常挑剔。在其他单元中工作良好的技术,如包含文件,在DPR中不会可靠地工作。当然,它们会编译,直到您做了一些导致IDE修改DPR的事情,这时DPR代码可能会被破坏。

    但是,在DPR中不必严格包括所有引用的文件。这是一个好主意,因为它似乎使IDE更快乐和更快,但是如果DPR只引用了您的测试,而测试引用了您的主项目中的单元,那么一切都将继续工作。

        3
  •  0
  •   Marco van de Voort    15 年前

    我总是尽量减少.dpr中的引用数:

    • 具有重要初始化的单元
    • 涉及VFI继承的单元
    • 自动实例化窗体的单位。
    • 有时几个中央单元可以用ctrl-enter快速导航业务代码。

    并且总是尽可能地使用最小(相对)路径。

    一般来说,只存在一个小问题,通过文件浏览单元->open有时会弄乱当前的工作目录,从而使相关路径的“根目录”变得混乱。解决方法是对basedirs中的某个单元执行文件-gt;打开。