Примеры тестов очистки ExUnit

У меня есть следующие тесты в приложении phoenix:

defmodule TattooBackend.Web.API.V1.PasswordControllerTest do
  use TattooBackend.Web.ConnCase, async: true
  use Bamboo.Test

  alias TattooBackend.Web.Endpoint
  alias TattooBackend.Accounts.Account
  alias TattooBackend.Repo
  alias Phoenix.Token
  alias Comeonin.Bcrypt
  import TattooBackend.AuthenticationRequiredTest

  test "without passwords", %{conn: conn} do
    account = insert(:account)
    token   = Token.sign(Endpoint, "account_id", account.id)

    conn =
      conn
      |> put_req_header("authorization", "#{token}")
      |> post(api_v1_password_path(conn, :create))

    assert json_response(conn, 422)
  end

  test "with wrong password confirmation", %{conn: conn} do
    account = insert(:account)
    token   = Token.sign(Endpoint, "account_id", account.id)
    params  = %{password: "new-password", password_confirmation: "password"}

    conn =
      conn
      |> put_req_header("authorization", "#{token}")
      |> post(api_v1_password_path(conn, :create, params))

    assert json_response(conn, 422)
  end
end

Эти строки повторяются в тестах:

account = insert(:account)
token   = Token.sign(Endpoint, "account_id", account.id)

Есть идеи, как сделать его более СУХИМ?


person Mateusz Urbański    schedule 04.07.2017    source источник
comment
Вы можете оценить этот пример в документации для ExUnit: hexdocs.pm/ex_unit/ExUnit .Callbacks.html#module-examples   -  person Alisso    schedule 04.07.2017


Ответы (1)


Если вы хотите выполнить эти две строки во всех тестах, вы можете поместить повторяющийся код в обратный вызов setup, а затем использовать сопоставление с образцом, чтобы получить их в каждом тесте:

defmodule TattooBackend.Web.API.V1.PasswordControllerTest do
  ...

  setup do
    account = insert(:account)
    token   = Token.sign(Endpoint, "account_id", account.id)
    [account: account, token: token]
  end

  test "without passwords", %{conn: conn, account: account, token: token} do
    conn =
      conn
      |> put_req_header("authorization", "#{token}")
      |> post(api_v1_password_path(conn, :create))

    assert json_response(conn, 422)
  end

  test "with wrong password confirmation", %{conn: conn, account: account, token: token} do
    params  = %{password: "new-password", password_confirmation: "password"}

    conn =
      conn
      |> put_req_header("authorization", "#{token}")
      |> post(api_v1_password_path(conn, :create, params))

    assert json_response(conn, 422)
  end
end

setup будет выполнять свой код перед каждым тестом, а затем передавать account и token каждому тесту.

person Dogbert    schedule 04.07.2017