Ранний возврат не работает в интеграционных тестах в elixir / phoenix - PullRequest
1 голос
/ 04 мая 2020

Я новичок в Elixir, но при использовании Node мы часто возвращаемся раньше, но у меня возникают проблемы с тем, чтобы заставить работать код, похожий на ранний, в моих интеграционных тестах. Это моя проблема:

У меня есть этот метод в моем контроллере, который получает JSON в качестве параметра, мне нужно проверить, содержит ли JSON некоторые свойства (ключ и тип), если это не так Я хочу отправить клиенту сообщение об ошибке без необходимости выполнять остальную часть метода. Это отлично работает, когда я делаю запрос с помощью Insomnia или Postman, но не работает в моих интеграционных тестах. Код под условным условием выполняется, даже если условное выражение является ложным.

Это мой метод:

def create(conn, body) do
    if !PayeeContext.check_for_required_fields(body), do: conn
      |> send_resp(400, "Please provide Key and Type parameters")

    %{"key" => key} = body
    %{"type" => type} = body

    validation_func = PayeeContext.validation_map(type)

    case validation_func.(key) do
      {:ok, _} ->
        conn |> send_resp(200, "Request created successfully")
      {:error, message} -> conn |> send_resp(400, message)
    end
  end

, и это мой тест

test "returns 400 if Key prop is missing", %{conn: conn} do
      params = %{
        key: "44187221816",
        account: %{
          account_type: "checking_account",
          account_number: "00028363-6",
          branch: "0001"
        },
        owner: %{
          name: "Eve Montalvão"
        }
      }

      response = conn |> post(Routes.payee_path(conn, :create, params))

      assert response.status == 400
    end

и мой PayeeContext .check_for_required_fields

  def check_for_required_fields(fields) do
    Enum.all?(@required_fields, fn field -> Map.has_key?(fields, field) end)
  end

Что я делаю не так?

1 Ответ

3 голосов
/ 04 мая 2020

Операторы if в Elixir встречаются редко: сопоставление с образцом более идиоматично c. Разветвление потока выполнения может быть трудно проследить, и вы обнаружите, что «ранний возврат» в лучшем случае может немного сбивать с толку, а в худшем - анти-шаблон. соответствие шаблону в аргументах функции. Это не только устраняет необходимость в вашей функции проверки (поскольку сопоставление с шаблоном будет успешным только в том случае, если эти ключи присутствуют), но и позволяет вам определять несколько предложений функции create/2. Это фактически дает вам 2 пути выполнения: один для случаев, когда параметры key и type присутствуют, и другой, когда их нет.

def create(conn, %{"key" => key, "type" => type}) do

    validation_func = PayeeContext.validation_map(type)

    case validation_func.(key) do
      {:ok, _} ->
        conn |> send_resp(200, "Request created successfully")
      {:error, message} -> conn |> send_resp(400, message)
    end
end

def create(conn, _) do
  send_resp(conn, 400, "Please provide Key and Type parameters")
end

Помните: должны go first - выполнение будет отправлено первой функции, где совпадение будет успешным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...