Podczas pisania kodu w Javie, bardzo pomocne jest przyjmowanie composition i dependency injection, aby umożliwić i łatwo przeprowadzić test czystych jednostek poprzez kpiny ze współpracujących obiektów.Jak zrobić zastrzyk zależności i wyśmiewać w erlangu?
Uważam, że robienie tego samego w Erlang jest mniej proste i powoduje, że kod jest bardziej brudny.
To może być moja wina, bo jestem zupełnie nowy na Erlang i dość uzależniony JUnit, EasyMock i interfejsów Java ...
Powiedzmy mam tego głupiego funkcję:
%% module mymod
handle_announce(Announce) ->
AnnounceDetails = details_db:fetch_details(Announce),
AnnounceStats = stats_db:fetch_stats(Announce),
{AnnounceDetails, AnnounceStats}.
Kiedy testuję jednostkę mymod
, chcę tylko udowodnić, że details_db
i stats_db
są wywoływane z właściwymi parametrami i że zwracane wartości są używane poprawnie. Zdolność details_db
i stats_db
do wygenerowania prawidłowej wartości jest testowana w innych miejscach.
Aby rozwiązać ten problem, mogę byłaby mój kod w ten sposób:
%% module mymod
handle_announce(Announce, [DetailsDb, StatsDb]) ->
AnnounceDetails = DetailsDb:fetch_details(Announce),
AnnounceStats = StatsDb:fetch_stats(Announce),
{AnnounceDetails, AnnounceStats}.
i przetestować go w ten sposób (w zasadzie stubbing połączenia bezpośrednio do modułu testowego):
%% module mymod_test
handle_announce_test() ->
R = mymod:handle_announce({announce, a_value}, [?MODULE, ?MODULE, ?MODULE]),
?assertEqual({details,stats}, R).
fetch_details({announce, a_value}) ->
details.
fetch_stats({announce, a_value}) ->
stats.
To działa, ale kod aplikacji staje się brudny i zawsze muszę nosić tę paskudną listę modułów.
Próbowałem kilka bibliotek mock (erlymock i (this other one), ale nie był zadowolony.
jaki sposób jednostka przetestować swój kod erlang?
Dzięki!
Dzięki Gordon, bardzo dobrze wyjaśnione. Nadal próbuję przejść do paradygmatu funkcjonalnego. W każdym razie, w tym projekcie, który piszę (tracker tracker), wszystkie wywołania pochodzą z warstwy internetowej i kończą w bazie danych, więc większość modułów ma lub zależy od efektów ubocznych. Spróbuję standardowych ram testowych. –
Dobry Erlang ma mieć wiele małych funkcji. Refaktor i włóż swój kod do modułów użytkowych, a będziesz zaskoczony, jak niewiele z tego wymaga zapisywania do bazy danych. 15 - 25 linii to długa funkcja w Erlang. Funkcja czysta to taka, która pobiera zestaw parametrów, oblicza na nich i po prostu zwraca wartość - powinieneś mieć ich dużo. –
Nie zgadzam się, że powinieneś jak najszybciej przejść do testów integracyjnych. W przypadku sparametryzowanych modułów i szyderstw podanych przez erlymock, dana funkcja będzie trywialna do przetestowania. Możesz przetestować go wewnątrz samego modułu, kpiąc z dwóch modułów db na czas trwania testu. Możesz użyć tego modułu w innych testach, ustawiając moduły db jako parametry Twojego modułu. Każdy, kto patrzy na szyderczo w erlangu, powinien po raz drugi spojrzeć na erlymock - głównym problemem jest brak dokumentacji, więc naprawdę musisz przeczytać źródło, by pogodzić się z tym. –