Graphql查询测试无法在Phoenix中正确返回结果

时间:2018-09-08 02:04:59

标签: elixir graphql absinthe

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

我阅读并遵循了《用苦艾酒在Elixir中制作GraphQL API》一书,并专心于对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"}]}}% 

2 个答案:

答案 0 :(得分:2)

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

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

仅出于完整性考虑:您可以执行MIX_ENV=test iex -S mix phx.server,然后使用 test 环境,因此可以使用CURL命令检查查询是否返回了{的结果{1}}环境/数据库。

答案 1 :(得分:1)

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

您可以尝试将测试切换到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