0

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

我阅读并遵循了《用苦艾酒在 Elixir 中制作 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 方法,所以我将其更改为发布:

@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"}]}}% 
4

2 回答 2

2

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

当你用你的环境启动 Phoenix 时,默认情况下iex -S mix phx.server应该是devMIX_ENV (如果你是空的)。

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

于 2018-09-08T09:06:06.953 回答
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
于 2018-09-08T19:34:44.953 回答