Создание двойного теста в OCaml - PullRequest
6 голосов
/ 19 августа 2011

Как обычно в OCaml используется двойной тест, который подделывает соединение с базой данных?

Допустим, вы хотите протестировать небольшой API поверх базы данных, и способ, которым это работает, заключается в предоставлении Connection введите для каждой функции, предоставляемой API.

Что-то вроде:

let get_data connection = do_something_with_connection

Как это будет проверяться модулем?

В более широком смысле, является ли этот вид тестирования обычным в OCaml, учитывая тот факт, что мощная система типов OCaml уже гарантирует, что вы не делаете странных ошибок?

Ответы [ 2 ]

3 голосов
/ 20 августа 2011

Вы бы создали объект, который имеет все те же имена методов, что и Connection, каждый с одинаковыми сигнатурами (и, очевидно, с функциональностью заглушки). Затем вы можете создать экземпляр одного из этих объектов и объявить его подключением через подтип. Затем его можно передать в любую из функций.

Здесь - полезный бит о подтипах (что, следует отметить, не то же самое, что наследование в Ocaml).

1 голос
/ 13 сентября 2011

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

Так, например, ваш файл db.ml может выглядеть примерно так:Вы можете просто заглушить модуль подключения

let test_get_data () =
  let module TestConnection = struct
    type t = unit
    let execute _ _ = ["data"]
  end in
  let module TestDb = Db.Make(TestConnection) in

  assert (TestDb.get_data () = ["munged data"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...