2009-01-19 81 views

回答

4

我以另一种方式解决这个问题。我写了一个加载DFM文件的小实用程序,并查找不应存在的属性。包括database.connected = true值。

这可以修改为使用任何适当的属性。我也把代码的核心放在这里。

为了使这真的很有用,你应该在你的构建脚本中使用这个工具(我使用FinalBuilder)。我的脚本首先在.dfm文件上循环,剥离所有这些属性,然后编译并运行单元测试。如果他们通过,那么它会继续构建主应用程序。对我而言,这是一个比单元测试失败更好的方法,因为您可以从保证已知的好点开始。

nState := 0; 
bFound := False; 
for nFileLoop := 0 to memoFile.Lines.Count - 1 do 
begin 
    szLine := memoFile.Lines[nFileLoop]; 

    case nState of  // 
    0: 
    begin 
     if(0 <> Pos('TADOConnection', szLine)) then 
     begin 
      szSeeking := 'Connected'; 
      nState := 1; 
     end 
     else if(0 <> Pos('TADOTable', szLine)) then 
     begin 
      szSeeking := 'Active'; 
      nState := 1; 
     end 
     else if(0 <> Pos('TADOQuery', szLine)) then 
     begin 
      szSeeking := 'Active'; 
      nState := 1; 
     end 
     else if(0 <> Pos('TDBISAMTable', szLine)) then 
     begin 
      szSeeking := 'Active'; 
      nState := 1; 
     end 
     else if(0 <> Pos('TDBISAMDatabase', szLine)) then 
     begin 
      szSeeking := 'Connected'; 
      nState := 1; 
     end 
     else if(0 <> Pos('TDBISAMSession', szLine)) then 
     begin 
      szSeeking := 'Active'; 
      nState := 1; 
     end 
     else if(0 <> Pos('TDBISAMQuery', szLine)) then 
     begin 
      szSeeking := 'Active'; 
      nState := 1; 
     end; 
    end; 
    1 : 
    begin 
     bFound := True; 
     if(0 <> Pos('end', szLine)) then 
     begin 
      nState := 0; 
     end 
     else if(0 <> Pos(szSeeking, szLine)) then 
     begin 
      nPos := Pos('=', szLine); 
      if nPos > 0 then 
      begin 
       memoFile.Lines[nFileLoop] := Copy(szLine, 1, nPos) + ' False'; 
      end; 
     end; 
    end; 
    end;  // case 
end; 
5

你可以写你自己设为TSQLConnection的后裔,不存储其Connected属性:

TdzAdoConnection = class(TADOConnection) 
    published 
    property Connected stored false; 
    end; 

,并使用该组件,而不是设为TSQLConnection。

(以上是TAdoConnection,但设为TSQLConnection也应该可以正常工作。)

9

GExperts有我们配置到每个编译关闭数据库连接的“设置组件属性”专家。既然这样做,我们没有问题。

+0

甜,从来不知道存在。谢谢。 – TrevorD 2009-01-19 19:06:55

1

OpenCTF - Delphi的组件测试框架可能很有趣,它会自动为所有窗体/数据模块中所有组件的指定属性创建单元测试。它是开源的,易于使用。

“入门”文档:http://www.habarisoft.com/download/OpenCTFGettingStarted.pdf

的OpenCTF组件测试框架 有助于建立用于在Delphi应用程序的所有 (视觉的和非可视)VCL组件 自动测试。它基于DUnit框架基于 。

一些有用的例子:

  • 检测丢失或错误的属性值 - 例如没有分配操作的按钮,没有关联数据集的数据源
  • 检测未分配的事件处理程序 - 例如,缺少OnExecute事件
  • 检查所有数据集可以打开
  • 检查Tab顺序
  • 找到隐形的部件(例如无形TabSheets哪个好将会在运行时被隐藏)

OpenCTF http://www.mikejustin.com/images/OpenCTF.gif

+0

Missing link: http://openctf.sourceforge.net/ – EMBarbosa 2014-06-21 13:37:29

0

另一种方法解决这个问题是实现一个pre-commit钩子到你的供应链管理。我使用了TortoiseSVN,并且我做了类似的事情来防止偷偷摸摸的事情。例如,我们有一个“皮肤”库,它试图向在IDE中打开的任何表单添加大约十几个皮肤单元。 (我们有一个注册表补丁可以“修复”这种行为,但如果开发人员重新安装组件,它会每隔一段时间就会“未完成”)。所以我在SVN预提交钩子的.ini文件中有一个“禁用的字符串列表”。

在我们的环境中,所有生产代码都建立在专用的“生成机器”上,所以如果代码没有签入,它不会生成生成。问题解决了。