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

dma*_*kic 8 delphi dunit

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

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

小智 9

GExperts有一个"设置组件属性"专家,我们配置为在每次编译时关闭数据库连接.既然这样做,我们就没有遇到过这个问题.


dum*_*uch 5

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

  TdzAdoConnection = class(TADOConnection)
  published
    property Connected stored false;
  end;
Run Code Online (Sandbox Code Playgroud)

并使用该组件而不是TSqlConnection.

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


mj2*_*008 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;
Run Code Online (Sandbox Code Playgroud)