【发布时间】:2017-04-01 03:40:34
【问题描述】:
总的来说,我对 elixir 和函数式编程还很陌生,我正在努力正确地对由其他函数组成的函数进行单元测试。一般问题是:当我有一个函数 f 使用其他函数 g 时,h...在内部,我应该采用哪种方法来测试整体?
来自 OOP 世界,想到的第一个方法涉及注入 f 依赖的函数。我可以对 g、h... 进行单元测试并将所有这些作为参数注入 f。然后,f 的单元测试将确保它按预期调用注入的函数。不过,这感觉像是过拟合,并且作为一种总体上笨重的方法,它违背了函数式思维方式,函数组合应该是一件便宜的事情,你不应该担心自己在整个代码库中传递所有这些参数。
我还可以对 g、h...以及 f 将其中的每一个都视为黑匣子,这感觉是合适的做法,但是 f 的复杂性测试急剧增加。进行可扩展的简单测试是单元测试的主要目的之一。
为了使论点更具体,我将举一个函数示例,该函数在内部构成其他函数,但我不知道如何正确进行单元测试。这尤其是用于处理以 RESTful 方式创建资源的插件的代码。请注意,一些“依赖项”是纯函数(例如 validate_account_admin),但其他不是(Providers.create):
def call(conn, _opts) do
account_uuid = conn.assigns.current_user.account["uuid"]
with {:ok, conn} <- Http.Authorization.validate_account_admin(conn),
{:ok, form_data} <- Http.coerce_form_data(conn, FormData),
{:ok, provider} <- Providers.create(FormData.to_provider(form_data), account_uuid: account_uuid) do
Http.respond_create(conn, Http.provider_path(provider))
else
{:error, reason, messages} -> Http.handle_error(conn, reason, messages)
end
end
谢谢!
【问题讨论】:
标签: unit-testing testing functional-programming elixir