Как я могу постепенно настроить макет с помощью Meck?

Я хотел бы иметь возможность постепенно устанавливать макет (с помощью Meck), чтобы ожидания для разных вызовов устанавливались в разных функциях настройки теста. я думал merge_expects может сделать трюк. Но я вижу неожиданные результаты:

default__second_expect_overwrites_first_expect_test() ->
  meck:unload(),
  meck:new(womble, [non_strict]),

  meck:expect(womble, sleep, fun(8) -> ok end),
  meck:expect(womble, sleep, fun(24) -> comatose end),

  ?assertEqual(comatose, womble:sleep(24)),
  ?assertError(function_clause, womble:sleep(8)).

merge_expects__second_expect_has_no_effect_test() ->
  meck:unload(),
  meck:new(womble, [non_strict, merge_expects]),

  meck:expect(womble, sleep, fun(8) -> ok end),
  meck:expect(womble, sleep, fun(24) -> comatose end),

  ?assertError(function_clause, womble:sleep(24)),
  ?assertEqual(ok, womble:sleep(8)).

Я знаю, что могу использовать следующий обходной путь, но это ухудшит мои тесты:

workaround_test() ->
  meck:unload(),
  meck:new(womble, [non_strict]),

  meck:expect(womble, sleep, [{[8], ok}, {[24], comatose}]),
  ?assertEqual(comatose, womble:sleep(24)),
  ?assertEqual(ok, womble:sleep(8)).

1 ответ

Решение

Похоже, что это "ошибка", связанная с использованием забав в качестве спецификаций ожиданий (я думаю, что это никогда не поддерживалось, но в любом случае это не задокументировано четко). В качестве обходного пути вы можете использовать expect/4:

1> meck:new(womble, [non_strict, no_link, merge_expects]).
ok
2> meck:expect(womble, sleep, [24], comatose).
ok
3> womble:sleep(8).
** exception error: no function clause matching womble:sleep(8)
4> womble:sleep(24).
comatose
5> meck:expect(womble, sleep, [8], ok).
ok
6> womble:sleep(8).
ok
7> womble:sleep(24).
comatose
Другие вопросы по тегам