2014-11-06 59 views
4

今天我遇到了與C#相關的問題。我必須編寫一個能通過一些測試的程序。我實現的一切工作正常,但有一個測試不允許使用公共字段,並且失敗。C#中的收益率回報 - 對域的公示進行失敗測試

我有一個泛型類實現IEnumerable的,而導致問題的事情是:

public IEnumerator<R> GetEnumerator() 
{ 
    foreach (R r in roomList) 
     yield return r; 
} 

如果我把這個類「零收益」,測試通過的罰款。我不知道什麼是錯的?這裏是測試報告:

Result Message:  Assert.Fail failed. Detected type "Exercise.Hotel`2+<GetEnumerator>d__0" with public filed(s) "Exercise.Hotel`2[R,SC] <>4__this, R <r>5__1, Enumerator <>7__wrap2", which is not allowed. 

這裏也是測試代碼。說實話,我不是很熟悉它是如何工作的。當然,這也可能是由不好的測試造成的。

 var withPublicField = types.Where(t => !t.IsEnum) 
      .Where(t => t.GetFields(BindingFlags.Public | BindingFlags.Instance).Count() > 0) 
      .Where(t => !t.Name.StartsWith("<>c__DisplayClass")) 
      .ToDictionary(t => t.FullName, t => t.GetFields(BindingFlags.Public | BindingFlags.Instance)); 

感謝您的幫助。這是我的第一個問題,所以我希望我做得很好:)

+0

向我們展示場屬性標記 – Steve 2014-11-06 22:48:56

+2

有沒有在這,只是'回roomList.GetEnumerator任何區別() '? – clcto 2014-11-06 22:49:34

+0

「不允許使用公共方法」您的意思是public _fields_?你爲什麼不允許使用公共方法? – 2014-11-06 22:51:34

回答

5

這是一個奇怪的測試,你在說什麼。

迭代器方法(即其中包含yield return的方法)觸發失敗的原因是C#編譯器重寫了這些方法,以便將實現該方法的隱藏類的實例作爲狀態機返回。就是那種不允許使用公共字段的類型。

就我個人而言,我認爲失敗是誤報。雖然我同意公共領域一般是可憎的,但在這種情況下,您正在處理隱藏的編譯器生成的代碼。這種特殊情況應該沒問題。

希望你可以在這種情況下壓制失敗,並解釋爲「這不是我的錯!」另一種方法是實現自己的類,該類爲場景實現IEnumerator<T>類型,哪些不包含公共字段。

編輯:我注意到看它已經試圖排除編譯器的測試代碼 - 爲捕獲的變量生成代碼(即Name.StartsWith("<>c__DisplayClass"))。因此,測試作者可能會爲編譯器生成的<GetEnumerator>類型添加類似的排除(或者當然,按照Lee的回答檢查[CompilerGenerated])。

4

你可能想忽略編譯器生成的類,它應與CompilerGeneratedAttribute裝飾:

var withPublicField = types 
    .Where(t => !t.IsEnum) 
    .Where(t => Attribute.GetCustomAttribute(t,typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute)) == null) 
...