【问题标题】:How to make Delphi DUnit test fail when TSQLConnection.Connected = true当 TSQLConnection.Connected = true 时如何使 Delphi DUnit 测试失败
【发布时间】:2009-01-19 11:46:18
【问题描述】:

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

由于我不想在 Connected = true 的情况下发布,所以当 dfm 中的 TSQLConnection.Connected 为 true 时,我需要我的 dunit 测试失败。

【问题讨论】:

    标签: delphi dunit


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      并使用该组件而不是 TSqlConnection。

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

      【讨论】:

        【解决方案3】:

        我用另一种方式解决了这个问题。我编写了一个小实用程序来加载 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;
        

        【讨论】:

          【解决方案4】:

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

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

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

          一些使用示例:

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

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

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-04-25
              • 1970-01-01
              • 2013-05-23
              • 2011-01-30
              • 2013-05-24
              • 2020-04-02
              • 2020-03-26
              • 1970-01-01
              相关资源
              最近更新 更多