Erlang 如何使用Meck逐步建立模拟?

Erlang 如何使用Meck逐步建立模拟?,erlang,eunit,meck,Erlang,Eunit,Meck,我希望能够逐步建立一个模拟(使用Meck),以便在不同的测试设置函数中设置对不同调用的期望。我想merge\u所期望的可能会奏效。但我看到了意想不到的结果: default__second_expect_overwrites_first_expect_test() -> meck:unload(), meck:new(womble, [non_strict]), meck:expect(womble, sleep, fun(8) -> ok end), meck:e

我希望能够逐步建立一个模拟(使用Meck),以便在不同的测试设置函数中设置对不同调用的期望。我想
merge\u所期望的
可能会奏效。但我看到了意想不到的结果:

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)).
这似乎是一个与使用funs作为期望规范相关的“bug”(我认为它从一开始就不受支持,但在任何情况下都没有明确的文档记录)。作为解决方法,您可以使用
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

确认修复了它-谢谢亚当。我所知道的唯一一个可能仍然需要使用
expect/3
的地方是设置一个类似这样的模拟:
meck:expect(m2,mult42,fun(X)->X*42 end)。
合并函数子句很棘手,因为它们可以有防护。目前,Meck没有实施这一措施。