我想要实现这一点的方法是创建一个程序来获取现有的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之外,这些单位没有被引用)。否则,只要使用任何一个单元就足以让初始化代码执行。
编辑
另一种选择是有第一个程序生成一个完整的单元,然后在您的测试应用程序使用本机。这将在所有引用单元的初始化/终止代码中进行编译。然后,您的测试应用程序将不得不使用您提到的全局存储库来访问这些对象。
这里的一个重要部分是确保测试项目搜索路径包含其他项目的源目录。
另一方面,如果一个单位在.dpr中,例如一个错误的路径,可以得到可怕的奇怪错误。 – 2009-07-22 21:14:28
当测试引用主项目的单元时,他们需要引用它们的路径,据我所知只有在dpr中才有可能。 – Ozan 2009-07-23 11:01:54