我想对 gen_fsm 进行单元测试,该 gen_fsm 使用相当大的记录来记录其状态。该记录是在 erl 文件中定义的,该文件还定义了 gen_fsm,因此(据我所知)对其他模块不可见。
可能的方法:
- 将记录放入 hrl 文件中并将其包含在两个模块中。这没问题,但是会将 gen_fsm 逻辑上拥有的代码分散到多个文件中。
- 在单元测试模块中使用原始元组伪造记录。这会变得非常难看,因为记录已经超过 20 个字段。
- 从我的 gen_fsm 导出一个函数,该函数将使用一些 record_info 魔法将 proplist 转换为正确的记录类型。虽然可能,但我不喜欢污染我的模块接口(interface)的想法。
- 实际上生成 gen_fsm 并向其发送一系列消息,使其处于单元测试的正确状态。这种方法非常复杂(尽管 Meck 提供了帮助),我觉得我在浪费这些伟大的、纯粹的 Module:StateName 函数,我应该能够在没有大量设置的情况下调用它们。
还有其他建议吗?
最佳答案
您可能会考虑将测试直接放入 gen_fsm 模块中,这当然会让他们访问记录。如果您不想在生产代码中包含测试,并且假设您使用的是 eunit,则可以按照 eunit user's guide 中的指示有条件地编译它们。 :
-ifdef(EUNIT).
% test code here
...
-endif.
关于unit-testing - 使用状态记录的单元测试流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5669016/