При написании кода на Java очень полезно охватить состав и внедрение зависимостей , чтобы сделать возможным и легким проведение чистого модульного тестирования путем насмешки взаимодействующих объектов.
Я считаю, что делать то же самое в Erlang не так просто, и это делает код более грязным.
Вероятно, это моя вина, так как я совсем новичок в Erlang и довольно зависим от JUnit, EasyMock и java интерфейсов ...
Допустим, у меня есть эта глупая функция:
%% module mymod
handle_announce(Announce) ->
AnnounceDetails = details_db:fetch_details(Announce),
AnnounceStats = stats_db:fetch_stats(Announce),
{AnnounceDetails, AnnounceStats}.
При модульном тестировании mymod
я хочу только доказать, что details_db
и stats_db
вызываются с правильными параметрами и что возвращаемые значения используются правильно.
Способность details_db
и stats_db
генерировать правильное значение проверена в других местах.
Чтобы решить эту проблему, я мог бы выполнить рефакторинг своего кода следующим образом:
%% module mymod
handle_announce(Announce, [DetailsDb, StatsDb]) ->
AnnounceDetails = DetailsDb:fetch_details(Announce),
AnnounceStats = StatsDb:fetch_stats(Announce),
{AnnounceDetails, AnnounceStats}.
И протестируйте это таким образом (в основном перевод звонков прямо в тестовый модуль):
%% 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.
Это работает, но код приложения становится грязным, и мне всегда приходится носить с собой этот уродливый список модулей.
Я пробовал пару фиктивных библиотек ( erlymock и ( эта другая ), но я не был удовлетворен.
Как вы тестируете свой код erlang?
Спасибо!