【问题标题】:Phoenix/Elixir: How to set the action in a test connection with Plug.Test.conn()?Phoenix/Elixir:如何使用 Plug.Test.conn() 在测试连接中设置操作?
【发布时间】:2016-12-04 00:05:57
【问题描述】:

我写了一个小插件,它接受一个动作列表作为选项。当当前调用的操作在此列表中时,插件的行为会有所不同。

为了对此进行测试,我需要在单元测试中设置操作。这可能吗?我在文档中没有找到任何内容。

这是 Plug 文档中给出的简短示例。

defmodule MyPlugTest do
  use ExUnit.Case, async: true
  use Plug.Test

  @opts AppRouter.init([])

  test "returns hello world" do
    # Create a test connection
    conn = conn(:get, "/hello")

    # Invoke the plug
    conn = AppRouter.call(conn, @opts)

    # Assert the response and status
    assert conn.state == :sent
    assert conn.status == 200
    assert conn.resp_body == "world"
  end
end

【问题讨论】:

  • 你能澄清一下你所说的动作是什么意思吗?
  • 您的意思是conn = put_private(conn, :phoenix_action, :action_name)(将 :action_name 替换为操作名称)?
  • 如果没有,你能发布插件的来源吗?我不确定我是否理解这个问题。
  • @Gazler 我的意思是控制器操作(新建、创建、索引等)。当我将选项except: [:create, :new] 传递给插件时,它不应该在操作为:create:new 时进行一些检查。因此,为了测试这一点,我需要能够在我的测试中调用特定的操作。
  • @Dogbert 谢谢,成功了!

标签: elixir phoenix-framework


【解决方案1】:

我会考虑在您的控制器测试中对这些进行集成测试。由于 conn.private 存储是为图书馆设计的,因此随时可能发生变化。

如果您不担心凤凰城的变化,那么您可以执行以下操作:

conn =
   conn(:get, "/hello")
   |> put_private(conn, :phoenix_action, :index)
   |> AppRouter.call(conn, [:index])

【讨论】:

    猜你喜欢
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2016-02-25
    相关资源
    最近更新 更多