J'essaie d'écrire des tests unitaires autour d'un programme personnalisé SynchronizationContext
mise en œuvre.
Les deux opérations importantes sur cette classe sont Send
y Post
, donde Send
invoque un délégué de manière synchrone et Post
invoque un délégué de manière asynchrone.
J'aimerais écrire des tests unitaires pour vérifier ce comportement, à savoir que les délégués ont été exécutés de manière synchrone ou asynchrone. Je ne veux pas que les tests s'appuient sur des délais pour les cas de réussite, car cela prolonge artificiellement l'exécution des tests (mais il est raisonnable que les échecs provoquent un délai).
Au départ, j'ai envisagé d'utiliser des tâches pour signaler l'exécution d'un délégué :
var tcs = new TaskCompletionSource<object>();
var context = new CustomSynchronizationContext();
context.Send((state) => tcs.SetResult(null), null);
// Task should already be completed!
Assert.IsTrue(this.tcs.Task.IsCompleted);
Cependant, cela ne garantit pas que le délégué a été pas exécuté de manière asynchrone très rapidement avant que le coureur de test ne puisse continuer.
Comment puis-je organiser un test autour du contexte pour m'assurer que Send
bloque l'achèvement du délégué et Post
ne le fait pas, mais que les délégués son tous deux invoqués ?