При написании кода на Java очень полезно включить composition и инъекция зависимостей, чтобы сделать возможным и легко выполнять чистое модульное тестирование путем издевательских взаимодействующих объектов.
Я считаю, что делать то же самое в 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 и (этот другой), но я не был удовлетворен.
Как вы unit test ваш код erlang?
Спасибо!