Как проверить методы контроллера, которые используют HEAD в Фениксе - PullRequest
0 голосов
/ 07 июня 2018

В настоящее время документация ясна и насыщена общими глаголами HTTP, но мы начали реализацию некоторых маршрутов HEAD сегодня, и она не тестируется так же, как другие.

Чтобы проверить, скажем, aGET метод:

conn = get conn, controller_path(conn, :controller_method, params)

Так что я бы предположил, что вы просто изменили бы get на head, но это не так.

Здесьмой маршрут:

template_journeys_count_path HEAD /v1/templates/:template_id/journeys GondorWeb.V1.JourneyController :count

и метод моего контроллера:

def count(conn, %{"template_id" => template_id}) do count = Templates.get_journey_count(template_id) conn |> put_resp_header("x-total-count", count) |> send_resp(204, "") end

и мой тест:

conn = head conn, template_journeys_count_path(conn, :count, template.id) assert response(conn, 204)

Но я получаю сообщение об ошибке, что ответ не получен, и resp_header, который я добавил, а не в conn.resp_headers

Я что-то упустил?Я также попытался настроить построение соединения, используя метод Plug.ConnTest build_conn, передав в него метод HEAD, но все равно не повезло.

1 Ответ

0 голосов
/ 07 июня 2018

ОК, после прочтения и тестирования почтальоном.Phoenix автоматически изменит HEAD запросы на GET запросы, поэтому, когда phoenix искал мой маршрут в маршрутизаторе, он выбирал маршрут get, который соответствовал моему методу :index.

Для HEAD маршрутов:

  • глагол в маршрутизаторе должен быть get, например: get '/items', :index
  • , если вы хотите поделитьсяпуть, просто добавьте put_resp_header к вашему возвращенному соединению в методе контроллера, в ответ будет отправлен только заголовок
  • Это нормально, что код ответа не 204, как в HEAD запросы w3c doc могут иметь ответ 200
  • , проверяя HEAD запрос, вы можете просто изменить get на head и проверить response_headers и что тело не былоотправлено.

Чтобы показать мои изменения ... вот мой маршрутизатор:

get "/journeys", JourneyController, :index

метод моего контроллера:

def index(conn, %{"template_id" => template_id}) do
    journeys = Templates.list_journeys(template_id)
    conn
    |> put_resp_header("x-total-count", "#{Enum.count(journeys)}")
    |> render("index.json", journeys: journeys)
end

и мой тест:

test "gets count", %{conn: conn, template: template} do
  conn = head conn, template_journey_path(conn, :index, template.id)
  assert conn.resp_body == ""
  assert Enum.at(get_resp_header(conn, "x-total-count"), 0) == "1"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...