【发布时间】:2017-05-29 15:52:34
【问题描述】:
这里可能有很多类似的问题,但我仍然不明白它是如何完成的。
假设我有以下琐碎的模块:
defmodule ModuleOne do
def do_something(argument) do
argument
|> do_first_thing()
|> do_second_thing()
|> ModuleTwo.do_something()
end
end
现在,我已经为 ModuleTwo 提供了测试,因此复制该测试逻辑没有意义。它也不是Twitter API 模块或类似的模块,所以我认为提出一个编译时模拟模块不是一个好主意(据我所知,这是一个好主意,以防万一,比如 HTTP 调用,但是对每个外部模块调用这样做显然会变成一团糟)而且我不想仅仅为了测试而将函数作为参数传递(特别是如果我调用了多个外部模块),因为它搞砸了与不必要的东西交互。
还有人建议不要使用模拟,比如 meck 库,这是这里最明显的决定,但我不明白为什么......
无论如何,考虑到上述所有建议,测试这个模块的好方法是什么?
谢谢
【问题讨论】:
-
我不太明白你的问题。你承认有覆盖
ModuleTwo的测试,那么为什么不写一个你期望ModuleOne.do_something/1做的测试呢? -
@JustinWood 因为以黑盒方式进行测试会导致测试重复,因为我需要测试
ModuleOne.do_something/1是否完成了ModuleTwo.do_something/1所做的事情 -
但是你明白了。您已经对其他模块进行了完整的测试。所以现在你只需要确保这个函数完成了它应该做的事情。如果
ModuleOne.do_something/1只调用ModuleTwo.do_something/1,那么我同意存在重复。但是,由于不仅仅是调用单个函数,因此没有重复。 -
基本上归结为这一点。按照您的逻辑,您不应该为您的应用程序编写任何测试。这是因为,归根结底,所有代码都是使用语言本身提供给我们的外部模块编写的,并且所有这些都经过了适当的测试。实际上,我们需要编写测试以确保我们将代码拼接在一起的方式,函数为我们提供了我们期望的输出。