2009-07-22 63 views
2

我正在为我们的主项目的所有单元测试构建一个专用项目,因为将它们包括在主项目中会对已经很大的项目代码库。现在,主项目的所有单元都在项目的dpr文件中引用其位置。当我为一个类编写测试用例时,我只需从主项目的dpr中复制类单元引用(以及引用的单元单元引用)并将其粘贴到单元测试项目中。德尔福:如何在另一个项目中使用一个项目的所有单位和单位参考

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

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

回答

2

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

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中,在您的项目使用条款中添加以下代码。由于使用条款包括文件已经包含了分号,使用包含文件在您的正常测试单元结束:

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

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

编辑

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

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

2

不,没有办法做到这一点(好),但它可能并不重要。 IDE维护着DPR,并且对事物的引用有着令人难以置信的挑剔。在其他单位中工作正常的技术(如包含文件)在DPR中无法可靠工作。当然,他们会编译,直到你做了一些事情导致IDE修改DPR,此时DPR代码可能会被损坏。

但是,在DPR中包含每个引用文件并不是必须的。这是一个好主意,因为它似乎使IDE更快乐,但是如果DPR只引用了你的测试并且测试引用了主项目中的单元,那么所有东西都可以工作。

+0

另一方面,如果一个单位在.dpr中,例如一个错误的路径,可以得到可怕的奇怪错误。 – 2009-07-22 21:14:28

+0

当测试引用主项目的单元时,他们需要引用它们的路径,据我所知只有在dpr中才有可能。 – Ozan 2009-07-23 11:01:54

0

我总是保持参考文献的数量。DPR最小:

  • 的单位,具有重要的初始化
  • 单位中涉及的VFI继承
  • 单位是自动实例化的形式。
  • 有时候会有几个中央单元用ctrl-enter快速导航业务代码。

并始终以最小(相对)路径尽可能。

工作正常,只有一个小问题,通过file-> open浏览单元有时会混淆当前工作目录,从而导致相关路径的“根”。解决方法是在basedirs中执行文件 - >打开单元。