【问题标题】:Unit testing processes that use records for state使用状态记录的单元测试过程
【发布时间】:2011-04-15 11:18:44
【问题描述】:

我想对使用相当大的状态记录的 gen_fsm 进行单元测试。该记录在 erl 文件中定义,该文件还定义了 gen_fsm,因此(据我所知)其他模块不可见。

可能的方法:

  1. 将记录放入 hrl 文件中,并将其包含在两个模块中。这没问题,但会将逻辑上归 gen_fsm 拥有的代码分散到多个文件中。
  2. 在单元测试模块中使用原始元组伪造记录。这将变得非常丑陋,因为记录已经超过 20 个字段。
  3. 从我的 gen_fsm 中导出一个函数,该函数将使用一些 record_info 魔术将 proplist 转换为正确的记录类型。虽然可能,但我不喜欢污染我的模块接口的想法。
  4. 实际上生成 gen_fsm 并向其发送一系列消息以使其处于单元测试的正确状态。这种方法有很大的复杂性(尽管 Meck 有帮助),我觉得我在浪费这些很棒的、纯粹的 Module:StateName 函数,我应该能够在没有大量设置的情况下调用它们。

还有其他建议吗?

【问题讨论】:

    标签: unit-testing erlang


    【解决方案1】:

    您可能会考虑将测试直接放入您的 gen_fsm 模块中,这当然可以让他们访问记录。如果您不想在生产代码中包含测试,并且假设您使用的是 eunit,则可以按照eunit user's guide 中的说明有条件地将它们编译入或编译出:

    -ifdef(EUNIT).
       % test code here
       ...
    -endif.
    

    【讨论】:

    • 您也可以使用 '-include("../tests/my_fsm_tests.hrl")' 代替 '% test code here',这样您仍然可以将测试代码与实际代码分开。
    • 谢谢史蒂夫,卢卡斯。我不喜欢我的生产和测试代码是不同的代码库的想法,所以我会将这种方法与其他方法分组:可行但有缺点。
    猜你喜欢
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 2017-12-01
    相关资源
    最近更新 更多