【问题标题】:Graphql Query testing doesn't return correctly the result in PhoenixGraphql 查询测试在 Phoenix 中没有正确返回结果
【发布时间】:2019-02-13 07:52:49
【问题描述】:

大家好,我是 Elixir 的新手,通常是 FP 的新手。所以基本上我尝试学习 Elixir,然后跳到构建一个 graphql api 服务器。

我阅读并遵循了“在 Elixir 中使用 Absinthe 制作 GraphQL APIs”一书,并坚持对 graphql 查询进行测试。

这本书是这么说的:

test "menuItems field returns menu items" do
  conn = build_conn()
  conn = get conn, "/api", query: @query
  assert json_response(conn, 200) == %{
   "data" => %{
     "menuItems" => [
       //key-value pair
     ]
   }
  }
end

这是我尝试的,我注意到在我的本地机器中,当我进行查询时,它使用 POST 方法而不是 GET 方法,所以我将其更改为 post:

@query """
{
  courses {
    name
  }
}
"""

test "courses field returns courses" do
  conn = build_conn()
  conn = post conn, "/api/graphiql", query: @query
  assert json_response(conn, 200) === %{
    "data" => %{
      "courses" => [
        %{"name" => "BSIT"},
        %{"name" => "BSCS"},
        %{"name" => "BSBA"}
      ]
    }
  }
end

然后当我运行测试时它失败了,因为查询返回空结果。

Assertion with === failed
  code:  assert json_response(conn, 200) === %{"data" => %{"courses" => [%{"name" => "BSIT"}, %{"name" => "BSCS"}, %{"name" => "BSBA"}]}}
  left:  %{"data" => %{"courses" => []}}
  right: %{"data" => %{"courses" => [%{"name" => "BSIT"}, %{"name" => "BSCS"}, %{"name" => "BSBA"}]}}
  stacktrace:
    test/voting_system_web/query/course_test.exs:15: (test)

然后我尝试通过 curl 测试查询,查询工作并返回结果。

 curl -X POST -H "Content-Type: application/json" --data '{ "query": "{ courses { name } }"}' http://localhost:4000/api/graphiql
 {"data":{"courses":[{"name":"BSIT"},{"name":"BSCS"},{"name":"BSBA"}]}}% 

【问题讨论】:

    标签: elixir graphql absinthe


    【解决方案1】:

    您是否已经检查过您的 test 数据库是否包含与您的 dev 数据库相同的数据? Phoenix 中的默认方式是为 test/dev/prod 使用不同的环境,因此您应该在您的项目的 config 文件夹,这也是定义 test/dev/prod 环境的数据库连接的位置。

    当您使用 iex -S mix phx.server 启动 Phoenix 时,您的环境应该默认为 dev(如果您的 MIX_ENV 为空)。

    为了完整起见:您可以执行 MIX_ENV=test iex -S mix phx.server 然后您将使用 test 环境,因此您可以使用 CURL 命令检查您的查询是否返回了 test 的结果环境/数据库。

    【讨论】:

    • 我昨天才意识到这一点。我不知道 phoenix 会为测试环境创建一个单独的数据库。
    【解决方案2】:

    我认为您只是以错误的方式发送有效载荷。您的 curl 命令使用内容类型设置为 json 的请求正文。但是,您的 elixir 测试使用的关键字列表会被转换为多部分数据。

    您可以尝试将您的测试切换为 JSON POST 有效负载并调整您的查询:

    @query """
    query {
      courses {
        name
      }
    }
    """
    
    test "courses field returns courses" do
      conn = build_conn() |> put_req_header("content-type", "application/json")
      conn = post conn, "/api/graphiql", @query
      assert json_response(conn, 200) === %{
        "data" => %{
          "courses" => [
            %{"name" => "BSIT"},
            %{"name" => "BSCS"},
            %{"name" => "BSBA"}
          ]
        }
      }
    end
    

    【讨论】:

      猜你喜欢
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 2018-10-08
      • 2014-11-25
      相关资源
      最近更新 更多