gpt4 book ai didi

elixir - 如何在 Elixir Plug 测试中设置 POST 请求的主体?

转载 作者:行者123 更新时间:2023-12-01 11:19:55 25 4
gpt4 key购买 nike

使用Plug.Test.conn,设置请求正文似乎不起作用。

这是插件:

defmodule MyPlug do
import Plug.Conn

def init(_), do: nil

def call(conn, _) do
{:ok, body, _conn} = read_body(conn)
send_resp(conn, 200, "body: #{body}")
end
end

使用 curl:

$ curl -X POST -d foo=bar http://localhost:4000/
body: foo=bar

使用 Plug.Test:

defmodule MyTest do
use ExUnit.Case, async: false
use Plug.Test

test "POST request" do
conn = conn(:post, "/", %{foo: "bar"})
|> MyPlug.call(%{})
assert conn.resp_body == "body: foo=bar"
end
end

失败:

  1) test POST request (MyPlugTest)
test/my_plug_test.exs:28
Assertion with == failed
code: conn.resp_body() == "body: foo=bar"
left: "body: "
right: "body: foo=bar"

我还尝试按照 docs 传递字符串并设置内容类型 header .

最佳答案

在传递给 conn 之前,使用 Poison.encode! 将正文转换为二进制:

defmodule MyPlug do
import Plug.Conn

def init(_), do: nil

def call(conn, _) do
{:ok, body, _conn} = read_body(conn)
send_resp(conn, 200, "body: #{body}")
end
end

defmodule MyTest do
use ExUnit.Case
use Plug.Test

test "POST request" do
conn = conn(:post, "/", Poison.encode!(%{foo: "bar"}))
|> MyPlug.call(%{})
assert conn.resp_body == ~S(body: {"foo":"bar"})
end
end

但是 Plug.Conn.read_body 只能使用一次,之后它会丢弃数据。因此,您可能希望使用 Plug.Parsers 在管道中更早地解析正文:

plug Plug.Parsers,
parsers: [:urlencoded, :multipart, :json],
pass: ["*/*"],
json_decoder: Poison

解析后,正文在conn.body_params中可用,并合并到conn.params中。

关于elixir - 如何在 Elixir Plug 测试中设置 POST 请求的主体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45154121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com