2010-08-18 85 views
1

我正在嘗試爲我們正在開發的MVC應用程序編寫一些測試。我們有一個包含以下內容的BaseController類:MSTest,訪問器,繼承和私有成員

public class BaseController : Controller 
{ 
    protected string UserRole { get; private set; } 

然後我們有一個控制器從BaseController繼承:

public class CustomFieldController : BaseController 

我產生私人存取兩個類(只再生他們幾個幾分鐘前)。在我的單元測試CustomFieldController一個我想設置UserRole的,所以我有下面的代碼:

CustomFieldController controller = new CustomFieldController(); 
CustomFieldController_Accessor accessor = new CustomFieldController_Accessor( 
    new PrivateObject(controller, new PrivateType(typeof(BaseController)))); 

accessor.UserRole = "OTHER"; 

每次我嘗試運行這個測試,它拋出一個異常的最後一行指出:

無法找到指定的成員(CustomFieldEdit)。您可能需要重新生成私有訪問者,或者該成員可能是私有的,並且在基類中定義。如果後者爲真,則需要將定義該成員的類型傳遞給PrivateObject的構造函數。

據我所知,我已經說完了。我最近不僅重新生成了私有訪問器,而且還將定義該成員的類型傳遞給PrivateObject的構造函數。

有什麼想法,我在這裏失蹤?我知道我可以通過從屬性setter中取出「private」來使其工作,但如果我可以避免這種情況,我寧願不這樣做(不希望子類實現者認爲他們可以向該屬性注入值)。

+0

只要不使用這些私人的存取東西 - 它只會讓你寫代碼的垃圾。你應該只對你的類的公共接口進行單元測試。 – Grzenio 2010-08-18 09:39:16

+3

也許我的帖子不清楚。我沒有試圖去測試這個屬性(這很愚蠢)。爲了測試屬性需要在其中具有價值的幾個方法的所有代碼路徑。 我也不同意只有公共接口應該測試。私有方法通常構成公共接口的基礎,並且能夠測試這些較小的工作單元以確保它們全部正確地完成它們的工作,這似乎與單元測試是完全一致的。 – 2010-08-18 13:52:40

回答

4

CustomFieldController controller = new CustomFieldController();
var po = new PrivateObject(controller, new PrivateType(typeof(BaseController)));
CustomFieldController_Accessor accessor = new CustomFieldController_Accessor(po);

po.SetFieldOrProperty("UserRole","OTHER"); 

+0

這樣做。謝謝。 – 2011-07-06 20:35:00

+0

雖然這確實解決了問題,我理解爲什麼它解決了它(需要添加PrivateType以便Accessor在執行時知道在哪個對象中查找成員),我可以建議爲將來的答案添加一個簡短的解釋用戶? – bsara 2012-08-22 17:37:01