8

W tej chwili robię coś podobnego do this, aby przetestować bibliotekę, która komunikuje się z naszymi kontrolerami API, i jak na razie dobrze, ale wpadłem w pułapkę. We wszystkich naszych innych testach integracyjnych przeprowadzamy test wewnątrz transakcji MSDTC na poziomie izolacji ReadCommitted, aby każdy z nich miał własną prywatną sesję z bazami danych i tym podobne, a na końcu każdego testu transakcje zostały wycofane. ..Ale to nie działa dla testów tych, ponieważ transakcje są dla poszczególnych wątków i wszystkie metody HttpClient/HttpServer są asynchroniczne, więc praca jest wykonywana na innym wątku niż główny dla tego testu, doesn ' t mieć transakcję otoczenia do subskrypcji, i idzie w prawo i zatwierdza.Korzystanie z TransactionScope podczas testowania integracji web apis

Natknąłem się na kilka postów dotyczących otwierania TransactionScope w jednym wątku, a następnie tworzenia zależnej transakcji, która ma zostać przekazana do nowego zadania przez zamknięcie, ale nie mam pojęcia, jak zastosować to do HttpClient to jest połączone z HttpServer w pamięci. I podejrzany Po prostu nie myślę o tym we właściwy sposób, ale to wszystko, co muszę zrobić.

Co miałoby sens/praca/etc? Mam pełną kontrolę nad tworzeniem HttpServera i HttpClient, które się z nim łączą, ale nie mam pojęcia, co z nimi zrobić.

UPDATE:

Pewien postęp został made- Napisałem obsługi wiadomości, które można utworzyć transakcję zależne od wątku roboczego jeśli Transaction.Current jest wypełniana, gdy robi się tam, a dla niektórych z moich rozmów tak jest, ale dla innych nie jest, i zastanawiam się, czy mogę ścigać cienie - jak, jest dużo ContinueWith wokół i myślę, że jest wykonywany na wątku wywołującym (który naturalnie miałby transakcję) jeśli zadanie poprzedzające jest już ukończone.

Czy to możliwe, aby uruchomić synchronicznie wszystko i nosić testowy wątek przez całą drogę? Eksperymentowałem trochę z ContinueWith'ing synchronicznie bez większego sukcesu ..

Odpowiedz

0

Jak się okazało, HttpClient i HttpServer nie były przędzie wątków tła - raczej miałem błędne Task.StartNew's w moim kodzie, które były przyczyną problemu. Usunięcie tych doprowadziło mnie do działania.

0

Jeśli nie używasz rzeczywistego połączenia HTTP, możesz wywołać interfejsy bezpośrednio za pomocą kodu (za pomocą odwołania do zespołu) z szkielet testowy, który pozwala na wykonywanie sesji i testów na starcie i wyłączanie (takie jak klasa MSTest i funkcje inicjowania testu). W takim przypadku należy otworzyć TransactionScope, który jest współużytkowany przez klasę w zmiennej członkowskiej i unieszkodliwiać ją w klasie lub testować funkcję wyłączania. Ponieważ nie wywołałeś funkcji .Commit(), wycofa ona operacje, które wystąpiły podczas transakcji.

+0

Cóż, tak właśnie testujemy kontrolery, ale chodzi o przetestowanie interakcji między biblioteką C#, która usuwa komunikację z interfejsem web apis, która wymaga użycia prawdziwego połączenia HTTP. Po stronie wyższej, myślę, że znalazłem odpowiedź - obiekt HttpServer nie wydaje się zakodować wątku wywołań Async, ale mój kod po stronie klienta zrobił, zupełnie niepotrzebnie. Zabrałem te rzeczy i działa dobrze. –