Правильный способ использования 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 ", {...}}.

http://www.erlang.org/doc/apps/eunit/chapter.html

Другие вопросы по тегам