Cómo hacer que la prueba Delphi DUnit falle cuando TSQLConnection.Connected = true

StackOverflow https://stackoverflow.com/questions/457363

  •  19-08-2019
  •  | 
  •  

Pregunta

Cuando se utiliza Delphi IDE, cambiará silenciosamente SQLConnection.Connected a " true " al rellenar listas de campos o tablas en varias propiedades.

Como no quiero lanzar con Connected = true, necesito que mi prueba dunit falle cuando TSQLConnection.Connected se deja verdadero en dfm.

¿Fue útil?

Solución

Resuelvo esto de otra manera. Escribí una pequeña utilidad que carga un archivo DFM y busca propiedades que no deberían estar presentes. Incluyendo la base de datos.connected = valores verdaderos.

Esto se puede modificar para trabajar con las propiedades apropiadas. He puesto el núcleo del código aquí también.

Para que esto sea realmente útil, debe usar esta utilidad en su script de compilación (yo uso FinalBuilder). Mi script comienza haciendo un bucle en archivos .dfm, eliminando cualquiera de estas propiedades, y luego compila y ejecuta las pruebas unitarias. Si pasan, entonces continúa construyendo la aplicación principal. Para mí, esta es una mejor manera que hacer que una prueba unitaria falle, ya que puedes comenzar desde un buen punto conocido garantizado.

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;

Otros consejos

GExperts tiene un " Establecer propiedades de componentes " experto que configuramos para cerrar conexiones de bases de datos en cada compilación. Desde que lo hicimos, no hemos tenido el problema.

Puede escribir su propio descendiente de TSQLConnection que no almacena su propiedad Connected:

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

y use ese componente en lugar de TSqlConnection.

(Lo anterior es para TAdoConnection, pero TSQLConnection también debería funcionar bien).

OpenCTF : el marco de prueba de componentes para Delphi puede ser interesante, crea automáticamente pruebas unitarias para propiedades específicas de todos los componentes en todos los formularios / módulos de datos. Es de código abierto y fácil de usar.

" Comenzando " documento: http://www.habarisoft.com/download/OpenCTFGettingStarted.pdf

  

El marco de prueba del componente OpenCTF   ayuda a construir pruebas automáticas para todos   (visual y no visual) componentes VCL   en una aplicación Delphi. Esta basado   en el marco DUnit.

Algunos ejemplos de uso:

  • detectar valores de propiedad faltantes o incorrectos, p. ej. Botones sin acciones asignadas, fuentes de datos sin conjunto de datos asociado
  • detectar controladores de eventos no asignados, p. ej. evento OnExecute faltante
  • compruebe que todos los conjuntos de datos se pueden abrir
  • compruebe el orden de tabulación
  • buscar componentes invisibles (por ejemplo, TabSheets invisibles que deberían ocultarse mejor en tiempo de ejecución)

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

Otro enfoque para este problema es implementar un enlace previo al compromiso en su SCM. Yo uso TortoiseSVN, y he hecho cosas similares para evitar que las cosas se cuelen. Por ejemplo, tenemos un " skins " biblioteca que intenta agregar una docena de unidades de máscara a cualquier formulario que abra en el IDE. (Tenemos un parche de registro que "repara" este comportamiento, pero no se realiza de vez en cuando, si un desarrollador vuelve a instalar componentes). Así que tengo una "lista de cadenas prohibidas" en un archivo .ini que se encuentra en un enlace de confirmación previa SVN.

En nuestro entorno, todo el código de producción se construye en una "máquina de compilación" dedicada, de modo que si el código no se registra, no se incluye en la compilación. Problema resuelto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top