[英]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.