代码之家  ›  专栏  ›  技术社区  ›  dmajkic

当tsqlconnection.connected=true时如何使delphi-dunit测试失败

  •  8
  • dmajkic  · 技术社区  · 15 年前

    当使用DelphiIDE时,它将静默地更改sqlconnection.connected为“true”,当填充不同属性中的字段或表列表时。

    因为我不想在connected=true的情况下释放,所以当tsqlconnection.connected在dfm中保留为true时,我需要我的dunit测试失败。

    5 回复  |  直到 10 年前
        1
  •  4
  •   mj2008    15 年前

    我用另一种方法解决这个问题。我编写了一个小实用程序来加载一个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;
    
        2
  •  9
  •   Jozz    15 年前

    gexperts有一个“set component properties”专家,我们将其配置为在每次编译时关闭数据库连接。既然这样,我们就没有问题了。

        3
  •  5
  •   dummzeuch Stijn Sanders    15 年前

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

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

    并使用该组件而不是tsqlconnection。

    (以上为tadoconnection,但tsqlconnection也可以正常工作。)

        4
  •  1
  •   mjn anonym    10 年前

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

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

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

    一些用法示例:

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

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

        5
  •  0
  •   Chris Thornton    13 年前

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

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