Sto provando a scrivere test unitari su un'implementazione personalizzata SynchronizationContext
.Come posso verificare che le implementazioni siano sincrone o asincrone laddove richiesto?
Le due operazioni importanti questa classe sono Send
e Post
, dove Send
invoca un delegato sincrono e Post
richiama un delegato in modo asincrono.
Vorrei scrivere test di unità per verificare questo comportamento, che i delegati siano stati eseguiti in modo sincrono o asincrono. Non voglio che i test facciano affidamento sui ritardi per i casi di successo, perché prolunga artificialmente i test in esecuzione (ma è ragionevole che i guasti causino un ritardo) durante l'esecuzione.
Inizialmente ho pensato di utilizzare le attività per segnalare l'esecuzione di un delegato:
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);
Tuttavia, questo non garantisce il delegato è stato non eseguito in modo asincrono molto rapidamente prima che il test runner potrebbe continuare.
Come posso organizzare un test di tutto il contesto per garantire che Send
blocchi per il completamento del delegato e Post
non lo fa, ma che i delegati sono sia invocato?
+1 per la domanda e il nome "Tragedian" una persona che risolvere i problemi ... :) –
Isn è possibile fare un postback di 'Thread.ManagedThreadId' su cui il delegato è stato eseguito? Se era uguale al thread principale, veniva eseguito in modo sincrono, altrimenti asincrono. – Davio
Il contesto di sincronizzazione non eseguirà alcun delegato sul thread chiamante, quindi temo di no. I thread sono solo un dettaglio di implementazione. –