Тестирование Graphql Query не возвращает правильно результат в Phoenix

Привет всем, я просто новичок в 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, поэтому я изменяю его на публикацию:

@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 ответа

Решение

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

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

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

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