【问题标题】:Can meck mock erlang:exit?可以模拟 erlang:exit 吗?
【发布时间】:2015-10-22 22:43:48
【问题描述】:

我希望这个在主管模块中:

stop() ->
  exit(whereis(mousetrap_sup), kill).

所以一个简单的测试可能会这样做:

stop_invokes_exit_test() ->
  meck:new(erlang, [unstick, passthrough]),
  meck:expect(erlang, whereis, 1, a_pid),
  meck:expect(erlang, exit, 2, true),
  mousetrap_sup:stop(),
  ?assert(meck:called(erlang, exit, [a_pid, kill])).

毫不奇怪,它挂了。

我可以看到在哪些地方可能无法通过测试来执行此代码,但有什么办法吗?

【问题讨论】:

    标签: erlang meck


    【解决方案1】:

    来自 meck 文档

    Meck 将无法模拟某些模块,因为 Meck 通过重新编译和重新加载模块来工作。由于 Erlang 有一个扁平的模块命名空间,因此必须在 Erlang VM 中全局替换模块。这意味着某些模块不能被模拟。以下是一个非详尽的模块列表,这些模块可能难以模拟或根本不可能:

    • 二郎
    • 操作系统
    • 加密
    • 编译
    • 全球

    所以不,你不能模拟退出。但是,您可以将退出调用包装在另一个函数中,然后对那个函数进行修改。

    【讨论】:

      【解决方案2】:

      您可以使用该名称生成一个进程,并检查退出原因:

      {Pid, Ref} = spawn_monitor(timer, sleep, [infinity]),
      register(my_sup, Pid),
      mousetrap_sup:stop(),
      receive
          {'DOWN', Ref, process, Pid, Reason} ->
              ?assertEqual(killed, Reason)
      after 1000 ->
          error(not_killed)
      end.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-12
        • 2015-12-24
        • 2011-07-06
        • 1970-01-01
        • 2018-08-14
        • 2015-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多