2008-09-10 78 views
5

我想將一段使用Windows Impersonation API的代碼封裝到一個整潔的小幫手類中,並且和往常一樣,我正在尋找一種先行先試的方法。但是,雖然WindowsIdentity是託管類,但實際上以另一個用戶身份登錄所需的LogonUser調用是advapi32.dll中的非託管函數。單元測試是否可以進行P/Invoke調用?

我想我可以通過引入一個接口讓我的幫助類在實現中使用和隱藏P/Invoke調用,但測試該實現仍然是一個問題。你可以想象,考慮到用戶實際上需要存在於系統中,實際上在測試中執行模擬可能有點問題。

回答

10

準則:不要測試你沒有寫的代碼。
您不應該擔心WinAPI實施不起作用(最有可能它按預期工作)。 您的關注應該是測試'配線',即如果您的代碼進行正確的WinAPI呼叫。在這種情況下,您只需要模擬界面,並讓模擬框架告訴您是否使用正確的參數進行了調用。如果是,你就完成了。

  • 創建IWinAPIFacade(具有相關的WinAPI方法)和實現CWinAPIFacade。
  • 寫測試該塞在IWinAPIFacade的模擬和驗證相應呼叫是由
  • 寫測試,以確保CWinAPIFacade被創建並插入作爲默認(在正常運轉)
  • 實施CWinAPIFacade其只是盲目委託給Platform Invoke調用 - 不需要自動測試這個層。只需進行手動驗證。希望這不會經常改變,也不會有任何突破。如果你在將來發現確實是,那就用一些測試來封鎖它。
+0

這是我採用的方法,我對它很滿意。但是,我仍然希望有一種方法來驗證我的具體類在調用Win32 API時是否「做正確的事情」。 :) – Rytmis 2008-10-31 11:24:08

+1

有。這就是所謂的集成測試。 – nathanchere 2014-04-02 01:01:47

0

我不確定我是否按照你..你不想自己測試PInvoke(你沒有寫它),所以你想測試包裝類是否按預期執行正確?

那麼,只需在包裝類中創建接口並進行測試呢?

在需要設置用戶等方面,我認爲這將是一個子彈,你需要咬。模擬包裝器PInvoke調用似乎很奇怪,因爲您只需確認並且接口存在:)

相關問題