J'écris des tests unitaires pour une application WinRT et je peux invoquer des méthodes privées non asynchrones en utilisant ceci:
TheObjectClass theObject = new TheObjectClass();
Type objType = typeof(TheObjectClass);
objType.GetTypeInfo()
.GetDeclaredMethod("ThePrivateMethod")
.Invoke(theObject, null);
Cependant, si la méthode privée en question est async
, le code continuera son exécution sans attendre sa fin.
Comment puis-je ajouter une fonctionnalité await
à cela?
Eh bien, vous devez utiliser la valeur renvoyée par la méthode. Connaissez-vous le type? Par exemple, si c'est toujours un Task
, vous pouvez utiliser:
await (Task) objType.GetTypeInfo()
.GetDeclaredMethod("ThePrivateMethod")
.Invoke(theObject, null);
Si vous ne connaissez pas le type de retour mais savez qu'il sera attendu, vous pouvez utiliser le typage dynamique:
await (dynamic) objType.GetTypeInfo()
.GetDeclaredMethod("ThePrivateMethod")
.Invoke(theObject, null);
Je voudrais essayer pour éviter d'avoir à appeler une méthode privée par réflexion dans vos tests unitaires en premier lieu cependant. Pouvez-vous le tester indirectement via l'API publique (ou interne)? C'est généralement préférable.
Invoke
devrait renvoyer un objet convertible en Task
. Juste await
ça.
Si votre méthode privée renvoie void
, vous aurez besoin d'un SynchronizationContext
personnalisé, ce qui est compliqué. Il vaut mieux que vos méthodes retournent Task
/Task<T>
.