Как смоделировать http ответ остальных API? - PullRequest
4 голосов
/ 06 октября 2019

Я ищу самый простой способ смоделировать ответ API остальных в рамках testthat.

Пример использования будет похож на это:

with_mock_api(
  request, 
  response, 
  {
      call_to_function_with_api_call()
      # expectations check
  }
)

В результате,тесты пройдут без вызова реального API.

  • request относится к определению http-запроса, который будет выполняться внутри функции-оболочки API;
  • response относится кобъект ответа, который был кэширован с целью насмешки.

1 Ответ

4 голосов
/ 07 октября 2019

https://github.com/ropensci/vcr делает это довольно легко. Поддерживает интеграцию с crul, а также httr.

Функция, которая делает запрос API

foo_bar <- function() {
  x <- crul::HttpClient$new("https://httpbin.org")
  res <- x$get("get", query = list(foo = "bar"))
  jsonlite::fromJSON(res$parse("UTF-8"))
}

Затем запустите любые функции внутри блока vcr::use_cassette и выполните все тесты, которые ожидаются на выходе, как обычно

library(testthat)
test_that("my_test", {
  vcr::use_cassette("foo_bar", {
    aa <- foo_bar()
  })

  expect_is(aa, "list")
  expect_named(aa, c("args", "headers", "origin", "url"))
  expect_equal(aa$args$foo, "bar")
})

Запрос и ответ сохраняются в файле yaml - см. Пример https://github.com/ropensci/vcr#usage. - При первом запуске приведенного выше кода будет сделан реальный HTTP-запрос для создания этого файла yaml, НО во 2-м и всех последующих запусках после этого не будет выполнено никаких реальных HTTP-запросов, но вместо этого функция использует этот файл yaml.

...