2009-01-19 12 views

Respuesta

4

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 database.connected = true values.

Esto se puede modificar para que funcione con las propiedades adecuadas. Aquí también he puesto el núcleo del código.

Para hacer esto realmente útil, debe usar esta utilidad en su script de compilación (yo uso FinalBuilder). Mi secuencia de comandos 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 para construir la aplicación principal. Para mí, esta es una mejor manera que hacer que falle una prueba de unidad, ya que puede partir de un punto bueno 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; 
5

Se puede escribir su propio descendiente de TSQLConnection que no almacena su propiedad conectada:

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

y usar ese componente en lugar de TSQLConnection.

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

9

GExperts tiene un experto en "Propiedades del conjunto de componentes" que configuramos para cerrar las conexiones de bases de datos en cada compilación. Desde que hicimos eso, no hemos tenido el problema.

+0

dulce, nunca supo que existía. Gracias. – TrevorD

1

OpenCTF - Component Test Framework para Delphi puede ser interesante, crea automáticamente pruebas unitarias para las propiedades especificadas de todos los componentes en todos los formularios/módulos de datos. Es de código abierto y fácil de usar.

"Getting Started" documento: marco de pruebas http://www.habarisoft.com/download/OpenCTFGettingStarted.pdf

El componente OpenCTF ayuda a construir pruebas automáticas para todos los componentes VCL (visuales y no visuales) en una aplicación Delphi. Está basado en en el marco de trabajo de DUnit.

Algunos ejemplos de uso:

  • detectar la falta de valores de la propiedad o equivocadas - por ejemplo, Botones sin acciones asignadas, DataSources sin DataSet asociado
  • detectan controladores de eventos no asignados, p. falta evento OnExecute
  • verificación de que todos los conjuntos de datos se pueden abrir
  • cheque el orden de tabulación
  • encontrar los componentes invisibles (por ejemplo,TabSheets invisibles que mejor deben ser ocultados en tiempo de ejecución)

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

+0

Falta el enlace: http://openctf.sourceforge.net/ – EMBarbosa

0

Otro enfoque para este problema es implementar un gancho pre-commit en su SMC. Yo uso TortoiseSVN, y he hecho cosas similares para evitar que las cosas se cuelan furtivamente. Por ejemplo, tenemos una biblioteca de "máscaras" que intenta agregar una docena de unidades de máscara a cualquier formulario que abras en el IDE. (Tenemos un parche de registro que "soluciona" este comportamiento, pero se "deja de hacer" de vez en cuando, si un desarrollador vuelve a instalar los componentes). Así que tengo una "lista de cadenas prohibidas" en un archivo .ini que está en un enlace de precompilación de SVN.

En nuestro entorno, todo el código de producción se basa en una "máquina de creación" dedicada, por lo que si el código no se registra, no entra en la compilación. Problema resuelto.

Cuestiones relacionadas