Graphql 查询测试没有 return 正确地在 Phoenix 中得到结果
Graphql Query testing doesn't return correctly the result in Phoenix
大家好,我是 Elixir 的新手,通常是 FP 的新手。所以基本上我尝试学习 Elixir,然后跳转到构建 graphql api 服务器。
我阅读并遵循了这本书 "Craft GraphQL APIs in Elixir with Absinthe" 并坚持测试 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
然后当我 运行 测试失败时,因为查询 returns 空结果。
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 测试查询,查询有效,returns 结果。
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"}]}}%
您是否已经检查过您的 test 数据库是否包含与 dev 数据库相同的数据? Phoenix 的默认方式是为 test/dev/prod 使用不同的环境,因此你应该在项目的配置文件夹中找到相应的 .exs
文件,这也是 test/dev/ 的数据库连接位置prod 环境已定义。
当您使用 iex -S mix phx.server
启动 Phoenix 时,您的环境应该默认为 dev(如果您的 MIX_ENV
为空)。
只是为了完整起见:您可以执行 MIX_ENV=test iex -S mix phx.server
然后您将使用 test 环境,因此如果您的查询 returns test
environment/database.
的结果
我认为您只是以错误的方式发送了有效载荷。您的 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
大家好,我是 Elixir 的新手,通常是 FP 的新手。所以基本上我尝试学习 Elixir,然后跳转到构建 graphql api 服务器。
我阅读并遵循了这本书 "Craft GraphQL APIs in Elixir with Absinthe" 并坚持测试 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
然后当我 运行 测试失败时,因为查询 returns 空结果。
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 测试查询,查询有效,returns 结果。
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"}]}}%
您是否已经检查过您的 test 数据库是否包含与 dev 数据库相同的数据? Phoenix 的默认方式是为 test/dev/prod 使用不同的环境,因此你应该在项目的配置文件夹中找到相应的 .exs
文件,这也是 test/dev/ 的数据库连接位置prod 环境已定义。
当您使用 iex -S mix phx.server
启动 Phoenix 时,您的环境应该默认为 dev(如果您的 MIX_ENV
为空)。
只是为了完整起见:您可以执行 MIX_ENV=test iex -S mix phx.server
然后您将使用 test 环境,因此如果您的查询 returns test
environment/database.
我认为您只是以错误的方式发送了有效载荷。您的 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