2009-07-20 21 views
1

我有一些方法使用反射將一種對象類型轉換爲另一種。我正在通過Moq測試轉換方法,並且偶然發現了一個我不知道如何處理的行爲。當我通過Moq對象反射來獲取PropertyInfo時,我得到兩個額外的對象。在Moq對象上反射產生2個附加屬性

  • Moq.Mock``1[Namespace.Class+IElement] Mock
  • Moq.Mock Mock

重現這個代碼如下:

public void Moq_Reflection() { 
    var realElement = new Stuff(); 

    // Produces 2 items 
    PropertyInfo[] pInfo = realElement.GetType().GetProperties(); 

    var mockElement = new Mock<IElement>(); 
    mockElement.Setup(e => e.Property1).Returns(12); 
    mockElement.Setup(e => e.Property2).Returns(42); 

    // Produces 4 items 
    pInfo = mockElement.Object.GetType().GetProperties(); 
} 

public interface IElement { 
    int Property1 { get; set; } 
    int Property2 { get; set; } 
} 

public class Stuff : IElement 
{ 
    public int Property1 
    { 
     get { return -1; } 
     set { } 
    } 

    public int Property2 
    { 
     get { return -2; } 
     set { } 
    } 
} 

有沒有一種方法,以反映起訂量的對象上,而不是檢索這些屬性?

回答

0

我看了一下LinqPad中的代碼,我能找到的唯一解決方案是根據PropertyType或Name是否包含「Mock」來排除這兩個屬性。例如:

pInfo.Where(item => item.PropertyType.ToString().Contains("Mock") == false); 
pInfo.Where(item => item.Name.Contains("Mock") == false); 

這是邊界hacky,但它是我能找到的唯一屬性。我不認爲有一種方法來過濾反射本身。

+0

我一直希望它不會那樣。沒有什麼比在您的主應用程序中編寫代碼來補償您的測試更醜陋的了。謝謝,但我很感激幫助! – 2009-07-20 18:11:10

1

今天下午我正在考慮這個問題,所以這是另一個想法。

如果我在自己的項目中編寫了這個代碼,我會抽象出對象的反射。我將創建一個接口,該接口爲將返回對象屬性的類定義合同,然後創建一個實現該接口的類,並使用反射返回該屬性集。和你可能做的一樣。

但是,在測試中,我會創建一個接口的新實現,但我會添加我需要的任何規則以濾除我的模擬對象上不需要的屬性。我的實時代碼不包含測試所需的任何代碼。

我只是想知道這個想法,只是想幫忙。祝你好運!

相關問題