我在写单元测试的WinRT的应用程序,我能够调用非异步使用这个私有方法:
TheObjectClass theObject = new TheObjectClass();
Type objType = typeof(TheObjectClass);
objType.GetTypeInfo()
.GetDeclaredMethod("ThePrivateMethod")
.Invoke(theObject, null);
但是,如果有问题的私有方法是async
,代码将继续执行,而不必等待它完成。
如何添加await
功能呢?
那么你需要使用该方法的返回值。 你知道是什么类型? 举例来说,如果它总是一个Task
,你可以使用:
await (Task) objType.GetTypeInfo()
.GetDeclaredMethod("ThePrivateMethod")
.Invoke(theObject, null);
如果你不知道的返回类型,但知道这将是awaitable,你可以使用动态类型:
await (dynamic) objType.GetTypeInfo()
.GetDeclaredMethod("ThePrivateMethod")
.Invoke(theObject, null);
我会尽量避免在首位,虽然叫反射私有方法的单元测试。 你可以通过公共(或内部)API间接地测试它? 这是一般可取。
Invoke
应该返回一个对象转换为Task
。 只是await
这一点。
如果您的专用方法返回void
,那么你就需要自定义SynchronizationContext
,这是凌乱。 最好是有你的方法返回Task
/ Task<T>