喜比我聰明:-)我有這需要一代抽象類的其他應用程序的屬性,而且由於測試的目的是爲了調試相當困難的。爲此我創建了一個包裝,現在(而不是本地應用程序)模擬設置不有一套
然而,原生應用期待着與只有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做到這一點的
是的,我想測試的類。不過,我將在下週撰寫大約30個這樣的類,並且我不想創建每個抽象類的子類並覆蓋屬性。這將花費相當多的時間,然後不允許我重新使用我的「主」應用程序代碼,因爲它必須在每個類中進行更改。 現在,我可以將Mock更改爲模擬,代碼完全符合我需要做的事情。 這說明嗎? –
我明白了。我在我的回答中添加了一些評論。 –
我在發表您的評論之前發佈。至於做 mock.SetupGet(x => x.paramFullNameLike).Returns();不,我沒有使用過。我正在使用反射設置值,因爲我不想爲每個不同的屬性編寫代碼,這些屬性將在我的課程中。每個類都會有自己需要設置的不同屬性,因此可以使用反射。 –