【问题标题】:Unit testing side effects in ElixirElixir 中的单元测试副作用
【发布时间】:2018-04-16 02:58:34
【问题描述】:

我正在为调用模块的函数编写单元测试,作为调用它的副作用的一部分:

defmodule HeimdallrWeb.VerifyController do
  use HeimdallrWeb, :controller

  def verify(conn, _params) do
    [forwarded_host | _tail] = get_req_header(conn, "x-forwarded-host")

    case is_preview_page?(forwarded_host) do
      {:ok, false} ->
        conn |> send_resp(200, "")

      {:ok, %Heimdallr.Commits.Commit{} = commit} ->
        Heimdallr.Commits.touch_commit(commit)
        conn |> send_resp(200, "")

      {:not_found, _reason} ->
        conn |> send_resp(200, "")
    end
  end
end

副作用是从Heimdallr.Commits.touch_commit(commit)这一行触发的。

关于这个的几个问题:

  1. 我的单元测试是否应该与测试touch_commit 方法的效果有关。
  2. 如果是这样,我是否应该考虑传入一个通用的“触摸”函数来验证方法以使其更易于测试。由于 Phoenix / Elixirs 路由系统的性质,这可能很困难,我没有调查过。

如果我使用的是 Rails / Ruby / Rspec,那么我会期望在 HeimdallrCommits 模块上调用类级别的方法。

我担心和编写测试的原因是,将来我可能会通过删除或注释掉该行等方式意外删除涉及提交的功能。

【问题讨论】:

    标签: unit-testing elixir phoenix-framework


    【解决方案1】:

    我会说 1:不。那是为了在测试中保持较低的复杂性。您只想在一个方法中测试(无论您想测试什么),其余的都应该被忽略。您可以做的是验证您的方法调用了 touch_commit - 应该是一个好的模拟框架的一部分。这些是我的 5 美分,很抱歉我对 phoenix/elixir 不熟悉,所以我不能给你任何工作示例。就像验证方法一样,我正在考虑 Mockito 或 Moq..

    【讨论】:

      猜你喜欢
      • 2014-03-29
      • 2011-04-05
      • 2015-08-19
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多