65

我正在为 WinRT 应用程序编写单元测试,并且可以使用以下方法调用非异步私有方法:

TheObjectClass theObject = new TheObjectClass();
Type objType = typeof(TheObjectClass);
objType.GetTypeInfo()
       .GetDeclaredMethod("ThePrivateMethod")
       .Invoke(theObject, null);

但是,如果有问题的私有方法是async,代码将继续执行而不等待它完成。

如何await为此添加功能?

4

2 回答 2

113

那么您需要使用该方法返回的值。你知道类型吗?例如,如果它总是 a Task,您可以使用:

await (Task) objType.GetTypeInfo()
                    .GetDeclaredMethod("ThePrivateMethod")
                    .Invoke(theObject, null);

如果您不知道返回类型但知道它是可等待的,您可以使用动态类型:

await (dynamic) objType.GetTypeInfo()
                       .GetDeclaredMethod("ThePrivateMethod")
                       .Invoke(theObject, null);

不过,我会尽量避免首先在单元测试中通过反射来调用私有方法。您可以通过公共(或内部)API 间接测试它吗?这通常是可取的。

于 2013-02-05T16:01:09.187 回答
9

Invoke应该返回一个可转换为Task. 就是await这样。

如果您的私有方法返回void,那么您将需要一个 custom SynchronizationContext,这很混乱。最好让您的方法返回Task/ Task<T>

于 2013-02-05T16:00:49.807 回答