当TSQLConnection.Connected = true时,如何使Delphi DUnit测试失败

时间:2009-01-19 11:46:18

标签: delphi dunit

使用Delphi IDE时,它会在填充各种属性中的字段或表列表时以静默方式将SQLConnection.Connected更改为“true”。

由于我不希望以Connected = true发布,因此当dQm中TSQLConnection.Connected为真时,我需要我的dunit测试失败。

5 个答案:

答案 0 :(得分:9)

GExperts有一个“设置组件属性”专家,我们配置为在每次编译时关闭数据库连接。由于这样做,我们没有遇到问题。

答案 1 :(得分:5)

您可以编写自己的TSQLConnection后代,但不存储其Connected属性:

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

并使用该组件而不是TSqlConnection。

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

答案 2 :(得分: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;

答案 3 :(得分:1)

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

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

  

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

一些用法示例:

  • 检测遗漏或错误的属性值 - 例如未分配操作的按钮,没有关联DataSet的DataSource
  • 检测未分配的事件处理程序 - 例如缺少OnExecute事件
  • 检查是否可以打开所有数据集
  • 检查标签顺序
  • 找到不可见的组件(例如,隐藏的TabSheets,最好在运行时隐藏)

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

答案 4 :(得分:0)

解决此问题的另一种方法是在SCM中实现预提交挂钩。我使用TortoiseSVN,并且我做了类似的事情以防止事情进入。例如,我们有一个“皮肤”库试图将大约12个皮肤单元添加到您在IDE中打开的任何表单。 (我们有一个注册表补丁“修复”了这种行为,但如果开发人员重新安装组件,它会偶尔“取消”。所以我在.ini文件中有一个“禁止字符串列表”,该文件位于SVN预提交钩子中。

在我们的环境中,所有生产代码都是在专用的“构建机器”上构建的,因此如果代码没有签入,则不会使其进入构建。问题解决了。