2014-02-14 54 views
0
大家

喜比我聰明:-)我有這需要一代抽象類的其他應用程序的屬性,而且由於測試的目的是爲了調試相當困難的。爲此我創建了一個包裝,現在(而不是本地應用程序)模擬設置不有一套

然而,原生應用期待着與只有get公共抽象[obj類型]值可以定義我在Visual Studio中的抽象類;方法,如果我把一套,應用程序將炸彈。有什麼方法可以使用反射或模擬來設置字段到這個字段,而不是有set方法?

//simplified class 
public abstract class GetEUserAndDetails : [app specific interfaces] 
{ 
     public abstract Metastorm.Runtime.Types.Text paramFullNameLike 
     { 
      get; 
      set; //note: If i have this here, it will fail in Metastorm 
     } 
     public System.Data.DataSet Read() 
     { 
      //do something 
     } 
} 

,並在main()這是一個C#的winform,我有

Mock<Metastorm.Runtime.Models.MySampleProject.GetEUserAndDetails> mockMyBO = new Mock<Metastorm.Runtime.Models.MySampleProject.GetEUserAndDetails>() { CallBase = true }; 

//using reflection 
foreach (PropertyInfo pi in mockMyBO.Object.GetType().GetProperties()) 
{ 
    //simplified again, another form getting parameters and such 
    pi.SetValue(mockMyBO.Object, form.myTextParam, null); 
} 

如果我沒有設置方法,該pi.SetValue()行會失敗,但如果我這樣做,它會在本機應用程序中失敗。 (注意:我使用相同的測試工具來測試各種抽象類,這些抽象類將全部實現Read()方法,並且需要測試它是否將正確的數據拉回來,但參數對於每個類都是不同的。

很抱歉,如果我的代碼是壞我無法得到正常的格式,並且還請多多包涵,如果我使用了錯誤的條款。我沒有以任何方式的專家,剛夠是危險的。我我只是離開組活;線的時刻,手動複製/粘貼到主應用程序之前刪除它,但想另闢蹊徑,當有許多PARAMS做到這一點的

回答

0

如果我理解你的場景正確,你實際上想測試抽象類中的代碼,而不是模擬它。

考慮到這一點,我覺得在這種情況下,最簡單的方法是簡單地創建測試中的子類,將從您的基類繼承,並實現一切必要讓你能夠測試的基類。

如:

public class GetUserAndDetailsImplementation : GetEUserAndDetails 
{ 
    private Metastorm.Runtime.Types.Text _paramFullNameLike; 

    public override Metastorm.Runtime.Types.Text paramFullNameLike 
    { 
     get { return _paramFullNameLike; } 
    } 

    public void SetParamFullNameLike(Metastorm.Runtime.Types.Text text) 
    { 
     _paramFullNameLike = text; 
    } 
} 

你也可以使用該類作爲入口點的測試。

現在,如果你真的想使用模擬,你有沒有嘗試過以下?

var mock = new Mock<GetEUserAndDetails> { CallBase = true }; 
mock.SetupGet(x => x.paramFullNameLike).Returns(<some value>); 
+0

是的,我想測試的類。不過,我將在下週撰寫大約30個這樣的類,並且我不想創建每個抽象類的子類並覆蓋屬性。這將花費相當多的時間,然後不允許我重新使用我的「主」應用程序代碼,因爲它必須在每個類中進行更改。 現在,我可以將Mock 更改爲模擬,代碼完全符合我需要做的事情。 這說明嗎? –

+0

我明白了。我在我的回答中添加了一些評論。 –

+0

我在發表您的評論之前發佈。至於做 mock.SetupGet(x => x.paramFullNameLike).Returns();不,我沒有使用過。我正在使用反射設置值,因爲我不想爲每個不同的屬性編寫代碼,這些屬性將在我的課程中。每個類都會有自己需要設置的不同屬性,因此可以使用反射。 –