如何使用 Meck 逐步设置模拟?
How can I progressively set up a mock using 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)).
这似乎是 "bug" 与使用 funs 作为期望规范有关(我认为它一开始就不受支持,但无论如何都没有明确记录)。作为解决方法,您可以使用 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
我希望能够逐步设置模拟(使用 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)).
这似乎是 "bug" 与使用 funs 作为期望规范有关(我认为它一开始就不受支持,但无论如何都没有明确记录)。作为解决方法,您可以使用 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