[英]Using a setter as a parameter in C#? (Maybe with delegate?)
我們正在為一些硬件開發API,我正在嘗試用C#編寫一些測試。 用於重復性任務的try-catch塊使我的代碼變得臃腫和重復,所以對於getter我能夠像這樣包裝:
TestGetter(Func<int> method, double expectedVal)
{
int testMe = 0;
try
{
testMe = method();
PassIfTrue(testMe == expectedVal);
}
catch (Exception e)
{
Fail(e.Message);
}
}
所以我查詢硬件的某些已知值並進行比較。 我可以打電話:
TestGetter( () => myAPI.Firmware.Version, 24); //Or whatever.
哪個效果很好。 但我不確定如何對setter做同樣的事情。 即確保API實際設置一個值(並且在我嘗試設置時不會超時或任何其他情況)。 我想將setter傳遞給test方法並在那里調用它。
獎金問題:有沒有辦法用通用類型做到這一點? API中定義了一些自定義類型,我不確定為它們編寫這些測試包裝器的好方法,而無需為每種類型編寫新的重載方法。 感謝您的幫助!
你可以將getter和setter傳遞給函數:
void TestSetter<T>(Func<T> getter, Action<T> setter, T value)
{
try
{
setter(value);
PassIfTrue(EqualityComparer<T>.Default.Equals(getter(), value));
}
catch (Exception e)
{
Fail(e.Message);
}
}
這將設置值,然后獲取它並與傳遞給setter的值進行比較。
你必須把它稱為:
TestSetter(() => myAPI.Firmware.Version, v => myAPI.Firmware.Version = v, 24);
您可以像Reeds一樣使它們具有通用性,但您需要使用不同的比較方法:
public static void TestGetter<T>(Func<T> method, T expectedVal)
{
try
{
T actual = method();
PassIfTrue(expectedVal.Equals(actual));
}
catch (Exception ex)
{
Fail(ex.Message);
}
}
public static void TestSetter<T>(Action setMethod, Func<T> getMethod, T expectedVal)
{
try
{
setMethod();
T actual = getMethod();
PassIfTrue(expectedVal.Equals(actual));
}
catch (Exception ex)
{
Fail(ex.Message);
}
}
如果您認為Equals
方法不適用於預期類型,您也可以傳入Comparer操作來測試它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.