单位测试Elixir的副作用

时间:2018-04-15 03:20:09

标签: unit-testing elixir phoenix-framework

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

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路由系统的性质,这可能很难,我没有调查过。
  3. 如果我使用的是Rails / Ruby / Rspec,那么我会期望在HeimdallrCommits模块上调用类级方法。

    我对编写测试的关注和理由是,将来我可能会通过删除或注释掉行等而意外删除触及提交的功能。

1 个答案:

答案 0 :(得分:0)

我会说1:不。那就是在测试中保持低复杂性。你只想在一个方法中测试(无论你想测试什么),其余部分应该被模拟忽略。你可以做的是验证你的方法调用了touch_commit - 应该是一个好的模拟框架的一部分。这是我的5美分,很遗憾地说我不熟悉凤凰/灵药,所以我不能给你任何有用的例子。就像验证方法一样,我正在考虑Mockito或Moq ..