2009-01-19 26 views

回答

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; 
5

你可以寫你自己設爲TSQLConnection的後裔,不存儲其Connected屬性:

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

,並使用該組件,而不是設爲TSQLConnection。

(以上是TAdoConnection,但設爲TSQLConnection也應該可以正常工作。)

9

GExperts有我們配置到每個編譯關閉數據庫連接的「設置組件屬性」專家。既然這樣做,我們沒有問題。

+0

甜,從來不知道存在。謝謝。 – TrevorD 2009-01-19 19:06:55

1

OpenCTF - Delphi的組件測試框架可能很有趣,它會自動爲所有窗體/數據模塊中所有組件的指定屬性創建單元測試。它是開源的,易於使用。

「入門」文檔:http://www.habarisoft.com/download/OpenCTFGettingStarted.pdf

的OpenCTF組件測試框架 有助於建立用於在Delphi應用程序的所有 (視覺的和非可視)VCL組件 自動測試。它基於DUnit框架基於 。

一些有用的例子:

  • 檢測丟失或錯誤的屬性值 - 例如沒有分配操作的按鈕,沒有關聯數據集的數據源
  • 檢測未分配的事件處理程序 - 例如,缺少OnExecute事件
  • 檢查所有數據集可以打開
  • 檢查Tab順序
  • 找到隱形的部件(例如無形TabSheets哪個好將會在運行時被隱藏)

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

+0

Missing link: http://openctf.sourceforge.net/ – EMBarbosa 2014-06-21 13:37:29

0

另一種方法解決這個問題是實現一個pre-commit鉤子到你的供應鏈管理。我使用了TortoiseSVN,並且我做了類似的事情來防止偷偷摸摸的事情。例如,我們有一個「皮膚」庫,它試圖向在IDE中打開的任何表單添加大約十幾個皮膚單元。 (我們有一個註冊表補丁可以「修復」這種行爲,但如果開發人員重新安裝組件,它會每隔一段時間就會「未完成」)。所以我在SVN預提交鉤子的.ini文件中有一個「禁用的字符串列表」。

在我們的環境中,所有生產代碼都建立在專用的「生成機器」上,所以如果代碼沒有簽入,它不會生成生成。問題解決了。

相關問題