2012-08-03 51 views
3

我已經使用Visual Studio自己的「創建單元測試...」選項爲私有方法生成了單元測試。Visual Studio私人訪問器和簽入代碼

好,它的工作原理,但如果我現在嘗試檢查我的代碼,我打破了構建,因爲VS已經在AppData/Local/Temp中創建了需要構建的私有訪問器類。如果我試圖將這個文件放在我的源代碼樹中,它將不會編譯,因爲編譯器說它「必須定義一個主體」。真不明白,這反映雲雀...

這是訪問類:

#region Assembly AgentConfiguration_Accessor.exe, v4.0.30319 
// C:\Projects\AgentConfigurationTests\obj\Debug\AgentConfiguration_Accessor.exe 
#endregion 

using Agent.ConfigurationData; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using System; 

namespace Agent.AgentConfiguration 
{ 
    [Shadowing("Agent.AgentConfiguration.AgentConfigurationGui")] 
    public class AgentConfigurationGui_Accessor : BaseShadow 
    { 
     protected static PrivateType m_privateType; 

     [Shadowing("[email protected]")] 
     public AgentConfigurationGui_Accessor(); 
     public AgentConfigurationGui_Accessor(PrivateObject value); 

     [Shadowing("_agentPaths")] 
     public AgentPaths _agentPaths { get; } 
     [Shadowing("_agentServiceName")] 
     public static string _agentServiceName { get; set; } 
     [Shadowing("[email protected]")] 
     public void UpdateStatus(string statusMessage); 
    } 
} 

回答

2

在使用Private Accessors一段時間之後,我在使用我們的Souce Code Versioning系統進行分支和合並之後讓代碼編譯時遇到了一些麻煩。

我開始研究該主題,並在Visual Studio Team Test博客中找到一篇文章。據我瞭解,你應該而不是使用Private Accessor類。

有一個在指出這個功能不進一步支持任何更Generation of Private Accessors (Publicize) and Code Generation for Visual Studio 2010一個博客文章:

我們已經停止了對這些功能的Visual Studio 2010和 工作可以從刪除產品在以下版本中。這是由於 以下原因:

  • 缺乏資源和時間:重點此版本已改進爲 代碼生成手工測試人員的經驗,所以優先級和宣傳功能已降低。有 也是我們 利用尚未解決的宣傳功能的其他問題。
  • 語言團隊的新功能:由於語言團隊已對其項目類型和語言進行了修改,因此我們一直 無法響應他們所做的更改,並且尚未能夠 使用他們具有的新功能介紹。

當然也有是你能做什麼,而不是建議:

對於那些誰希望繼續測試內部API,你有三個 選擇:

  1. 使用Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject類來幫助訪問代碼中的內部和私有API。 這可在 Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll程序集中找到。
  2. 創建一個反射框架,該框架能夠反映出您的代碼以訪問內部或私有API。
  3. 如果您嘗試訪問的代碼是內部代碼,則可以使用InternalsVisibleToAttribute訪問您的API,以便您的測試 代碼可以訪問內部API。
1

我不使用此功能,但我沒有使用它一會兒,當我第一次開始學習關於單元測試。一般來說,單元測試應該測試這個類的公共表面。如果從這個原則開始,應該不需要訪問器類。

但你如何在你的類中測試重要的私有邏輯?我通常將私有方法提取到助手類中,在那裏它們成爲公共方法(認爲是「單一責任原則」)。作爲公共方法,當然,它們在沒有訪問者類的情況下變得可測試。原始類然後獲取輔助類的私有實例。

除了讓您避免測試中的訪問器類以外,此方法還可以讓您在測試中使用模擬對象變得更加輕鬆。當你測試原始類時,不要給它「真正的」助手類,而是給它一個模擬實例。這將原始類的測試與輔助類中的邏輯分離開來:如果在助手類中引入了一個錯誤,助手類的測試失敗,但原始類的測試不受影響。

+0

是的,我確實從測試一個私人方法得到一個有趣的感覺。我現在使用模擬來包裝有問題的方法,並以此方式完成。不過,在VS中知道如何去做(並保持項目的可移植性)會很好。 – Mijin 2012-08-03 12:31:39