【问题标题】:How to test a function call from a different module如何测试来自不同模块的函数调用
【发布时间】: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,那么我同意存在重复。但是,由于不仅仅是调用单个函数,因此没有重复。
  • 基本上归结为这一点。按照您的逻辑,您不应该为您的应用程序编写任何测试。这是因为,归根结底,所有代码都是使用语言本身提供给我们的外部模块编写的,并且所有这些都经过了适当的测试。实际上,我们需要编写测试以确保我们将代码拼接在一起的方式,函数为我们提供了我们期望的输出。

标签: testing elixir


【解决方案1】:

我的建议是:

1) 根本不要在ModuleOne 中调用ModuleTwo。然后只测试之前的转换。并将ModuleTwo 调用移动到调用者代码或其他“集成”模块。然后在集成级别分别测试调用者代码/集成模型。

2) 使用meck 测试ModuleTwo 是否已使用您期望的参数调用。但它与 1) 类似,因为它实际上测试了 2 个转换步骤。

【讨论】:

  • 我同意(1)。不要在 ModuleOne 中调用 ModuleTwo。相反,请ModuleOne.do_something() |> ModuleTwo.do_something()
【解决方案2】:

我同意 Lukáš Doležal 的观点。不要在ModuleOne.do_something() 中拨打ModuleTwo.do_something()。理想的情况是拥有能够很好地执行一项任务的小功能。因此,理想情况下,您应该改用ModuleOne.do_something() |> ModuleTwo.do_something()

然而,有时理想的东西并不实用。如果没有上下文,我们将不知道。如果是这种情况,并且您真的想以零重复覆盖所有内容,那么有一个可能适合您的折衷方案:

代替:

defmodule ModuleOne do

  def foo(bar) do
    bar
    |> first()
    |> second()
    |> ModuleTwo.foo()
  end

end

做:

defmodule ModuleOne do

  def foo(bar), do: do_foo(bar) |> ModuleTwo.foo()

  def do_foo(bar) do
    bar
    |> first()
    |> second()
  end

end

然后只测试ModuleOne.do_foo/1 而不是ModuleOne.foo/1

【讨论】:

    猜你喜欢
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2019-12-02
    • 1970-01-01
    • 2015-07-28
    • 2012-03-03
    • 1970-01-01
    相关资源
    最近更新 更多