大家好,我是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"}]}}%
答案 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