Правильный способ использования meck с foreach
Я использую meck для проверки моего gen_server mymodule
, В частности, я использую Мек, чтобы издеваться httpc
следуя инструкциям, приведенным здесь.
Вот код, который я извлек из своего теста:
do_some_tests_() ->
{foreach,
fun start/0,
fun stop/1,
[fun do_some_stuff/1,
fun do_some_other_stuff/1
]}.
start() ->
{ok, _} = mymodule:start_link(),
meck:new(httpc),
_Pid = self().
stop(_) ->
meck:unload(httpc),
mymodule:stop().
do_some_stuff(Pid) ->
%% here i use meck
meck:expect(httpc, request,
fun(post, {_URL, _Header, ContentType, Body}, [], []) ->
Reply = "Data to send back"
Pid ! {ok, {{"", 200, ""}, [], Reply}}
end),
%% here i do the post request
mymodule:myfunction(Body),
receive
Any ->
[
?_assertMatch({ok, {{_, 200, _}, [], _}}, Any),
?_assert(meck:validate(httpc))
]
end.
С помощью этого кода я могу запустить тесты, но есть еще две вещи, которые я не могу понять:
1) В результате я получаю что-то вроде:
mymodule_test:43: do_some_stuff...ok
mymodule_test:43: do_some_stuff...ok
mymodule_test:53: do_some_other_stuff...ok
mymodule_test:53: do_some_other_stuff...ok
Можно ли получить только одну строку для каждого теста вместо двух?
2) Как я могу добавить говорящее описание для каждого теста?
1 ответ
Функция do_some_stuff(Pid)
генерирует два теста, так что это нормально, оба проверяются и отображаются.
Однако вы можете добавить имя / описание к каждому генератору и тесту:
do_some_tests_() ->
{foreach,
fun start/0,
fun stop/1,
[{"Doing some stuff" , fun do_some_stuff/1},
{"Doing some other stuff" , fun do_some_other_stuff/1}
]}.
do_some_stuff(Pid) ->
%% [code]
[
{"Check 200" , ?_assertMatch({ok, {{_, 200, _}, [], _}}, Any)},
{"Check httpc" , ?_assert(meck:validate(httpc))}
]
end.
Это должно отображать что-то вроде:
module 'MyModule'
Doing Some Stuff
module:57: do_some_stuff (Check 200)...ok
module:58: do_some_stuff (Check httpc)...ok
На языке EUnit они известны как "названия":
Титулы
Любой тест или набор тестов T можно аннотировать заголовком, заключив его в пару {Title, T}, где Title - строка. Для удобства любой тест, который обычно представлен с использованием кортежа, может просто получить строку заголовка в качестве первого элемента, то есть написать {"The Title", ...} вместо добавления дополнительной оболочки кортежа, как в {"The Title ", {...}}.