Тестирование Graphql Query не возвращает правильно результат в Phoenix - PullRequest
0 голосов
/ 08 сентября 2018

Привет всем, я просто новичок в Elixir, как правило, новичок в FP. В общем, я пытаюсь выучить Elixir и затем перейти к созданию api-сервера graphql.

Я прочитал и следую книге "Создание API-интерфейсов GraphQL в 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

Затем, когда я запускаю тест, он не проходит, потому что запрос возвращает пустой результат.

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 голосов
/ 08 сентября 2018

Я думаю, что вы просто отправляете свои данные неправильно. Ваша команда 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
0 голосов
/ 08 сентября 2018

Вы уже проверили, содержит ли ваша база данных test те же данные, что и ваша база данных dev ? Путь по умолчанию в Phoenix заключается в использовании различных сред для test / dev / prod , и поэтому вы должны найти соответствующий файл .exs в папке config в ваш проект, и это также, где ваша связь с базой данных для среды test / dev / prod определяется.

Когда вы запускаете Phoenix с iex -S mix phx.server, ваша среда должна быть dev по умолчанию (если ваш MIX_ENV пуст).

Просто для полноты: вы можете выполнить MIX_ENV=test iex -S mix phx.server, тогда вы будете использовать среду test , и поэтому вы можете проверить с помощью команды CURL, возвращает ли ваш запрос результат для среды test /database.

...