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

8
使用Delphi IDE时,在填充各种属性的字段或表列表时,它会悄悄地将SQLConnection.Connected更改为“true”。由于我不想发布Connected = true的版本,所以需要在dfm中TSQLConnection.Connected保持true时使我的dunit测试失败。
5个回答

9

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


5
您可以编写自己的TSQLConnection子类,它不会存储Connected属性:
  TdzAdoConnection = class(TADOConnection)
  published
    property Connected stored false;
  end;

使用该组件而不是TSqlConnection。

(上述内容适用于TAdoConnection,但TSQLConnection也应该能正常工作。)


4
我用另一种方法解决了这个问题。我编写了一个小工具,加载DFM文件,并查找不应存在的属性,包括database.connected = true值。
可以修改此方法以适用于任何适当的属性。我在此处放置了核心代码。
为了使其真正有用,您应该在构建脚本中使用此实用程序(我使用FinalBuilder)。我的脚本从.dfms文件开始循环,剥离任何这些属性,然后编译和运行单元测试。如果测试通过,则继续构建主应用程序。对我来说,这比单元测试失败要好,因为您可以从已知的良好起点开始。
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;

1

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

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

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

一些使用示例:

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

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

的意思是:


0
另一种解决这个问题的方法是将一个预提交钩子实现到你的SCM中。我使用TortoiseSVN,并且我已经做了类似的事情来防止不良行为。例如,我们有一个“皮肤”库,它会尝试向IDE中打开的任何表单添加大约十几个皮肤单元。(我们有一个注册表补丁来“修复”这个行为,但如果开发人员重新安装组件,它会被“撤销”一段时间)。所以我在一个.ini文件中有一个“禁止字符串列表”,它在SVN预提交钩子中。
在我们的环境中,所有生产代码都是在专用的“构建机器”上构建的,因此如果代码没有被检入,它就不会进入构建。问题解决了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接