我正在为WinRT应用编写单元测试,我可以使用它来调用非异步私有方法:
TheObjectClass theObject = new TheObjectClass();
Type objType = typeof(TheObjectClass);
objType.GetTypeInfo()
.GetDeclaredMethod("ThePrivateMethod")
.Invoke(theObject, null);
但是,如果有问题的私有方法是async
,代码将继续执行而无需等待它完成。
如何向此添加await
功能?
答案 0 :(得分:94)
您需要使用该方法返回的值。你知道那种吗?例如,如果它总是Task
,您可以使用:
await (Task) objType.GetTypeInfo()
.GetDeclaredMethod("ThePrivateMethod")
.Invoke(theObject, null);
如果您不知道返回类型但知道它将是等待的,您可以使用动态类型:
await (dynamic) objType.GetTypeInfo()
.GetDeclaredMethod("ThePrivateMethod")
.Invoke(theObject, null);
我会尝试,以避免首先通过单元测试中的反射来调用私有方法。你可以通过公共(或内部)API间接测试吗?这通常是可取的。
答案 1 :(得分:7)
Invoke
应返回可转换为Task
的对象。只需await
那个。
如果您的私有方法返回void
,那么您将需要一个自定义SynchronizationContext
,这很麻烦。最好让方法返回Task
/ Task<T>
。