0

目前,文档中的常用HTTP动词清晰且充满活力,但我们HEAD今天开始实施一些路线,并且测试方式与其他路线不同。

测试说一个GET方法:

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

因此,我假设您只是更改gethead,但事实并非如此。

这是我的路线:

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,但仍然没有运气。

4

1 回答 1

1

使用邮递员进行更多阅读和测试后确定。Phoenix 会自动将HEAD请求更改为GET请求,因为当 phoenix 在路由器中查找我的路由时,它会命中与get路径匹配的路由,这是我的:index方法。

对于HEAD路线:

  • 路由器中的动词必须是 a get,例如:get '/items', :index
  • 如果要共享路径,只需put_resp_header在控制器方法中添加返回的连接,响应中只会发送标头
  • 响应代码不是 204 没关系,因为w3c 文档的 HEAD请求可以有 200 响应
  • 测试HEAD请求,您可以将 a 更改get为 ahead并测试 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
于 2018-06-07T14:14:00.637 回答