Napisałem własną warstwę dostępu do silnika gry. Istnieje GameLoop, która nazywa się każdą ramką, która pozwala mi przetwarzać mój własny kod. Mogę robić określone rzeczy i sprawdzać, czy takie rzeczy się zdarzały. W bardzo prosty sposób może to wyglądać tak:Jak przetestować kod asynchroniczny
void cycle()
{
//set a specific value
Engine::setText("Hello World");
//read the value
std::string text = Engine::getText();
}
chcę sprawdzić, czy mój Engine
-warstwa pracuje przez pisanie testów automatycznych. Mam doświadczenie w korzystaniu z Boost Unittest Framework do prostych testów porównawczych, takich jak ten.
Problem polega na tym, że niektóre rzeczy, które chcę wykonać, są przetwarzane po zakończeniu połączenia pod numerem cycle()
. Dlatego wywołanie Engine::getText()
bezpośrednio po Engine::setText(...)
zwróci pusty ciąg znaków. Jeśli miałbym poczekać do następnego połączenia cycle()
, zwrócona zostanie prawidłowa wartość.
Zastanawiam się teraz, w jaki sposób powinienem napisać moje testy, jeśli nie można ich przetworzyć w tym samym cyklu. Czy są jakieś najlepsze praktyki? Czy możliwe jest zastosowanie podejścia "tradycyjnego testowania" podanego przez Boost Unittest Framework w takim środowisku? Czy są możliwe inne ramy ukierunkowane na tak specjalistyczny przypadek?
Używam C++ do wszystkiego tutaj, ale mogę sobie wyobrazić, że istnieją odpowiedzi niezwiązane z językiem programowania.
UPDATE: Nie jest możliwe, aby uzyskać dostęp do Engine
poza cycle()
O ile silnik nie może zasygnalizować użytkownikowi, że jest przetwarzany, nie widzę, żeby to działało. Bardzo ciekawi jednak odpowiedzi innych ludzi. –