【问题标题】:How can I progressively set up a mock using Meck?如何使用 Meck 逐步设置模拟?
【发布时间】:2017-08-08 13:09:10
【问题描述】:

我希望能够逐步设置模拟(使用 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)).

【问题讨论】:

    标签: erlang eunit meck


    【解决方案1】:

    这似乎是一个与使用 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
    

    【讨论】:

    • 确认已修复 - 感谢 Adam。我知道我可能仍想使用expect/3 的唯一地方是设置这样的模拟:meck:expect(m2, mult42, fun(X) -> X*42 end).
    • 合并函数子句很棘手,因为它们可以有守卫。目前在 Meck 中没有实现。
    猜你喜欢
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    相关资源
    最近更新 更多