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

时间:2009-07-22 17:30:07

标签: delphi unit-testing

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

这意味着最终我将得到一个dpr文件,其中包含所有主要项目dpr文件单元引用逐字,这在主项目dpr更改时很难维护。我们在这里谈论成千上万的单位。

我的问题是,我可以以某种方式将一个项目的所有单位参考包含在另一个项目中吗?只需让主项目将其dcus编译在一个目录中,并将其包含在单元测试项目中,dcu搜索路径是不够的,因为单元具有必须执行的初始化例程。

3 个答案:

答案 0 :(得分:2)

不,没有办法做到这一点(好),但这可能并不重要。 IDE维护着DPR,并且对于引用的方式非常挑剔。在其他单元中工作正常的技术(如包含文件)在DPR中无法可靠地工作。他们肯定会编译,直到你做了一些导致IDE修改DPR的东西,此时DPR代码可能会被破坏。

但是,并不一定要在DPR中包含每个引用的文件。这是一个好主意,因为它似乎使IDE更快乐和更快,但如果DPR仅引用您的测试并且测试引用了主项目中的单元,那么一切都仍然有效。

答案 1 :(得分:2)

我实现这个的方法是创建一个程序来获取现有的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中,在project uses子句中添加以下代码。由于uses子句包含文件已经包含分号,因此在正常测试单元的末尾使用include文件。:

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

我的假设是你正在执行延迟/松散绑定,这就是为什么所有这些都是必要的(除了在DPR中之外没有引用单元)。否则只使用任何单位就足以让初始化代码执行。

修改

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

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

答案 2 :(得分:0)

我总是保留.dpr minimal中的引用数:

  • 具有重要初始化的单元
  • 参与VFI继承的单位
  • 自动实例化表单的单位。
  • 有时会使用ctrl-enter快速导航业务代码的几个中央单元。

并始终使用尽可能少的(相对)路径。

一般只有一个小问题工作正常,通过文件浏览单位 - >打开有时会弄乱当前工作目录,因此相关路径的“根”。解决方法是在基础文件中执行文件 - >打开单元。