2012-08-15 56 views
2

這可能是我需要擺脫我的系統的哲學咆哮,另一方面我可能做錯了什麼,如果是的話請告訴我!TestMethod生成錯誤CS0201

我有一個單元測試看起來是這樣的:

[TestMethod] 
[ExpectedException(typeof(NotImplementedException))] 
public void Test_XXXAccess() 
{ 
    ControlPoint.MyObject.XXXAccess; 
} 

,檢查,當測試是在一個特定的上下文中運行的性能XXXAccess未實現。此測試會生成編譯錯誤CS0201:「只有賦值,調用,增量,減量和新對象表達式可用作語句」雖然我同意這是生產代碼中的錯誤,但我認爲錯誤適用於單元測試。當然,我可以重新編寫代碼:

[TestMethod] 
[ExpectedException(typeof(NotImplementedException))] 
public void Test_XXXAccess() 
{ 
    MyType x = ControlPoint.MyObject.XXXAccess; 
} 

但是,這(對我來說)似乎更不正確的,你現在已經分配成一個變量做無非靜音錯誤更多。

有沒有更好的方法來編寫測試?

+1

除非您在''get''方法中使用'XXXAccess'屬性的副作用,除非您小心,否則這本身可能是不好的做法,我會說第二個版本是唯一正確的版本。要求編譯器記住你想要的東西很難。 :) – HonkyTonk 2012-08-15 14:30:03

+0

嗯...嗯,我使用了很多'Mock'對象來實現我的公共接口 - 這些是拋出異常的東西。我的測試檢查這些調用得到了那麼多,因爲如果沒有權限訪問這些方法,我有代理會拋出不同的異常....所以我猜這可能是不好的做法 - 但它似乎是最好的方法的東西。 – diversemix 2012-08-15 14:43:26

回答

2

如果您想檢查該類型沒有該名稱的屬性,則測試應使用typeof(whatever)上的反射;如果你想檢查吸氣器/設定器方法拋出NotImplementedException,你需要實際上電話那個方法。畢竟,你可能已經實現了getter而不是setter;但是,在這種情況下,你想要「提及」財產做什麼?最好實際撥打您感興趣的代碼並斷言發生了什麼。

我想如果這是你有興趣,吸氣,你能夠反映獲得getter方法,那麼就Invoke它(這不會需要聲明一個局部,你那麼不使用),但這比你已經確定的解決方案要冗長得多。

+0

感謝您的回覆。我無法使用反射,因爲該屬性將始終存在。這是一個只讀屬性,即沒有setter,我想測試調用getter會拋出NotImplementedException ...生成錯誤的測試就是這樣做的,它應該調用我感興趣的代碼,但是alas會生成錯誤:( – diversemix 2012-08-15 14:36:46