gpt4 book ai didi

使用 Elixir/Phoenix 测试 api 调用

转载 作者:行者123 更新时间:2023-11-28 20:40:07 24 4
gpt4 key购买 nike

我是 Elixir 和 Phoenix 的新手,我正在尝试创建一个网络服务来补充我的网站。首先,我只想通过从 json 文件导入一些数据来测试我的新数据结构。我想我会通过测试来做到这一点。我已经通读了基本指南(包括测试部分),但我无法找到有关测试 api 调用的任何内容。

根据下面的代码,当我运行 mix test 时出现以下错误:

** (ArgumentError) flash not fetched, call fetch_flash/2

这在进行调用并返回连接的线路上失败。我假设我使用了错误的电话/遗漏了什么?是否有我遗漏的文档,或者有人可以指出一个很好的例子吗?

这是我的 router.ex 的片段:

  scope "/", ContactsApp do
pipe_through :browser # Use the default browser stack

get "/", PageController, :index
resources "/contacts", ContactsController
end

# Other scopes may use custom stacks.
scope "/api", ContactsApp do
pipe_through :api

get "/import", ContactsController, :import
end

目前,我所做的只是复制 ContactsController.Create 方法并将其命名为 ContactsController.Import。我还复制了“创建资源并在数据有效时重定向”测试并使用 :import 而不是 :create

这是完整的堆栈跟踪:

** (ArgumentError) flash not fetched, call fetch_flash/2
stacktrace:
(phoenix) lib/phoenix/controller.ex:997: Phoenix.Controller.get_flash/1
(phoenix) lib/phoenix/controller.ex:982: Phoenix.Controller.put_flash/3
(contacts_app) web/controllers/contacts_controller.ex:74: ContactsApp.LogController.stuff/2
(contacts_app) web/controllers/contacts_controller.ex:1: ContactsApp.LogController.action/2
(contacts_app) web/controllers/contacts_controller.ex:1: ContactsApp.LogController.phoenix_controller_pipeline/2
(contacts_app) lib/phoenix/router.ex:261: ContactsApp.Router.dispatch/2
(contacts_app) web/router.ex:1: ContactsApp.Router.do_call/2
(contacts_app) lib/contacts_app/endpoint.ex:1: ContactsApp.Endpoint.phoenix_pipeline/1
(contacts_app) lib/phoenix/endpoint/render_errors.ex:34: ContactsApp.Endpoint.call/2
(phoenix) lib/phoenix/test/conn_test.ex:194: Phoenix.ConnTest.dispatch/5
test/controllers/contacts_controller_test.exs:69

最佳答案

感谢@Dogbert 和@sobolevn,我才能够弄清楚我做错了什么。当代码由 mix phoenix.gen.html 生成时, Controller 可能有如下内容:

def create(conn, %{"contact" => contact_params}) do
changeset = Contact.changeset(%Contact{}, contact_params)

case Repo.insert(changeset) do
{:ok, _contact} ->
conn
|> put_flash(:info, "Contact created successfully.")
|> redirect(to: contact_path(conn, :index))
{:error, changeset} ->
render(conn, "new.html", changeset: changeset)
end
end

当代码由 mix phoenix.gen.json 生成时, Controller 包含的代码略有不同:

def create(conn, %{"fred" => fred_params}) do
changeset = Fred.changeset(%Fred{}, fred_params)

case Repo.insert(changeset) do
{:ok, fred} ->
conn
|> put_status(:created)
|> put_resp_header("location", fred_path(conn, :show, fred))
|> render("show.json", fred: fred)
{:error, changeset} ->
conn
|> put_status(:unprocessable_entity)
|> render(ContactsApp.ChangesetView, "error.json", changeset: changeset)
end
end

在我复制和粘贴的代码中,有一个对 put_flash 的调用,正如@Dogbert 所建议的(这意味着与 :browser 管道一起工作)。使用 mix phoenix.gen.json 生成的代码可以解决问题。

关于使用 Elixir/Phoenix 测试 api 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36809295/

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