使用私用存取子
更新:2007 年 11 月
因為只有呼叫階層架構中的方法才能存取受測試程式碼的私用 (Private) 或內部方法,所以測試方法需要有「私用存取子」(Private Accessor) 才能間接呼叫這種具有存取限制的程式碼。
私用存取子是一種組件 (Assembly),其中包含受測試程式碼組件之每個方法的陰影實作。私用存取子中的每個方法都是公用方法,而且會使用受測試程式碼中對應方法的名稱。呼叫私用存取子中的方法即可叫用 (Invoke) 受測試程式碼的私用方法。如此便可輕鬆存取具有 private 存取限定詞的程式碼。
注意事項: |
---|
私用存取子也可以讓您的測試存取受測試程式碼中的私用變數。 |
私用存取子是方案總管中 [測試參考] 資料夾中的已編譯組件,其名稱為 <assembly_name>.private_accessor,其中 <assembly_name> 是專案之屬性中列出的組件名稱。
注意事項: |
---|
如需如何測試具有內部存取限定詞之項目的詳細資訊,請參閱設定 InternalsVisibleTo 屬性。 |
建立私用存取子
當您產生私用方法的單元測試時,除非測試專案中已經有私用存取子,否則 Visual Studio 都會自動建立私用存取子。
建置方案時,私用存取子中的參考也會一併更新。因此,變更實際執行程式碼 (Production Code) 之後,您應該重新進行編譯,以依照對應狀況更新您的私用存取子。
如需如何產生私用存取子的詳細資訊,請參閱 HOW TO:測試私用方法。
手動建立私用存取子
如果受測試組件中沒有任何私用存取子,您可以在不產生測試方法的情況下,產生私用存取子。
若要建立私用存取子或重新建立已經刪除的私用存取子,請以滑鼠右鍵按一下受測試程式碼。接著,按一下快速鍵功能表中的 [建立私用存取子],然後選取要放置私用存取子組件的測試專案。請注意,如果方案中沒有測試專案,這個功能表項目就不會出現。
注意事項: |
---|
您也可以使用 publicize 公用程式,從命令提示字元建立私用存取子。 |
使用私用存取子
若要測試私用程式碼,請先依照 HOW TO:測試私用方法的說明,建立私用存取子。接著,您的測試必須先具現化要存取私用方法的物件,然後再執行其測試步驟。
例如,您的實際執行程式碼在 BankAccount 類別中包含下列方法:
private void FreezeAccount()
{
m_frozen = true;
}
下列測試方法會測試私用的 FreezeAccount() 方法。若要存取 FreezeAccount() 方法,測試方法必須先具現化私用存取子組件中的 BankAccount_Accessor 物件。這麼做是必要的,因為 BankAccount_Accessor 包含 FreezeAccount() (也就是您想測試的方法) 的陰影實作。在下列程式碼中,FreezeAccount() 是透過私用存取子的陰影實作進行呼叫。
下列範例程式碼會自動產生,然後再由建立測試的人員進行編輯。TODO 陳述式 (Statement) 代表測試程式碼中必須在測試執行之前手動完成的陳述式。
[TestMethod()]
public void FreezeAccountTest()
{
BankAccount_Accessor target = new BankAccount_Accessor("Mr. Bryan Walton", 11.99); // TODO: Initialize to an appropriate value
target.FreezeAccount();
// Assert.Inconclusive("A method that does not return a value cannot be verified.");
bool creditAccount = false; // False means account could be credited: Fail test.
// Try to credit account
try
{
target.Credit(1.00);
}
catch (System.Exception)
{
// Threw exception. FreezeAccount worked correctly: Pass test.
creditAccount = true;
}
// Assert fails if 'creditAccount' condition is false. Fail test.
Assert.IsTrue(creditAccount, "Was able to credit account.");
}
這個範例在逐步解說:建立和執行單元測試中有詳細說明。