Comment attendre un async méthode privée appelée à l'aide de la réflexion dans WinRT?
Je suis en train d'écrire des tests unitaires pour une application WinRT, et je suis en mesure d'invoquer la non-async méthodes privées à l'aide de ceci:
TheObjectClass theObject = new TheObjectClass();
Type objType = typeof(TheObjectClass);
objType.GetTypeInfo()
.GetDeclaredMethod("ThePrivateMethod")
.Invoke(theObject, null);
Cependant, si la méthode en question est async
, le code de poursuivre l'exécution sans attendre la fin de la.
Comment puis-je ajouter await
de la fonctionnalité de cette?
- Puisque c'est une application WinRT, j'ai le sentiment que la réflexion/invocation de membres privés est rejetée. Je ne trouve pas la documentation officielle de ce google sur la droite maintenant, le plus proche est: blogs.microsoft.co.il/blogs/sasha/archive/2011/09/17/... EDIT: ce sont des jeux de tests, donc peut-être que c'est un non-problème. 🙂
- Sinclair en Fait, le code que j'ai ci-dessus fonctionne parfaitement bien pour des méthodes privées. Ma question est spécifiquement avec asynchrone ceux. La question s'appliquerait aux méthodes publiques appelé par l'intermédiaire de la réflexion en tant que bien.
Vous devez vous connecter pour publier un commentaire.
Eh bien, vous devez utiliser la valeur retournée par la méthode. Connaissez-vous le type? Par exemple, si c'est toujours un
Task
, vous pouvez utiliser:Si vous ne connaissez pas le type de retour, mais savons qu'il sera awaitable, vous pouvez utiliser typage dynamique:
Je essayer pour éviter d'avoir à appeler une méthode privée par la réflexion dans vos tests unitaires, en premier lieu, cependant. Pouvez-vous tester indirectement par le public (ou interne) de l'API? C'est généralement préférable.
dynamic
ne fonctionnera pas siGetAwaiter()
est une méthode d'extension, qui est exactement le cas pour WinRTIAsyncAction
.Task
objet retourné, de sorte que tout ce que j'avais à faire était de le jeter et ajouter leawait
. J'ai aussi trouvé que vous avez besoin de faire le test de l'unité de retour de la méthode type deTask
ainsi quand vous le faitesasync
ou elle ne sera pas exécutée par l'unité de test de cadre de travail.await
sans être dans unasync
de la méthode (ou lambda) - qui n'a rien à voir avec ce vous êtes en train d'attendre.async
ou pas?Task<T>
et d'exécuter de manière asynchrone sans être mis en œuvre via async/await.Thread.Sleep()
?var instance = MyFactory.Instance.Create(myClassName); // custom factory
var method = instance.GetType().GetMethod(myMethodName);
await (dynamic) method.Invoke(instance, null);
Invoke
doit retourner un objet convertiblesTask
. Justeawait
que.Si votre méthode renvoie
void
, alors vous aurez besoin d'un customSynchronizationContext
, ce qui est pénible. Il est préférable d'avoir de vos méthodes de retourTask
/Task<T>
.