Próbuję pisać testy jednostkowe wokół niestandardowej implementacji SynchronizationContext
.Jak mogę przetestować, czy implementacje są synchroniczne lub asynchroniczne, gdy jest to wymagane?
Dwie ważne operacje na tej klasy są Send
i Post
, gdzie Send
wywołuje delegata synchronicznie i Post
wywołuje delegata asynchronicznie.
Chciałbym napisać testy jednostkowe, aby zweryfikować to zachowanie, że delegaci zostali wykonani synchronicznie lub asynchronicznie. Nie chcę, aby testy polegały na opóźnieniach w przypadku powodzenia, ponieważ sztucznie przedłuża on testy (ale rozsądne jest, aby awarie powodowały opóźnienie) w wykonaniu.
Początkowo rozważaliśmy użyciu Zadania sygnalizować wykonanie delegat:
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);
Jednak to nie zapewnia pełnomocnik został nie wykonywane asynchronicznie bardzo szybko, zanim zawodnik testowy mógł kontynuować.
Jak mogę zorganizować test całym kontekście, aby Send
bloki zakończeniu delegata i Post
nie robi, ale że delegaci są zarówno powoływać?
+1 na pytanie, a nazwa "tragediopisarz" osoby, która rozwiąże problemy ... :) –
Isn czy możliwe jest odświeżenie wątku 'Thread.ManagedThreadId', na którym delegat został wykonany? Jeśli był taki sam jak główny wątek, został wykonany synchronicznie, w przeciwnym razie asynchronicznie. – Davio
Kontekst synchronizacji nie uruchomi żadnych delegatów w wątku wywołującym, więc obawiam się, że nie. Wątki to tylko szczegół implementacji. –