Вопрос основан на большом посте, связанном с F # / DI: https://fsharpforfunandprofit.com/posts/dependency-injection-1/
Я пытался опубликовать вопрос там. Однако, похоже, что из-за некоторых глюков на сайте сообщения больше не могут быть зарегистрированы. Итак, вот оно:
Интересно, как сценарий, описанный в этом посте, сработает / переведет в более реальный пример. Числа ниже немного с неба, поэтому, пожалуйста, отрегулируйте их так, как считаете нужным.
Рассмотрим некоторый достаточно небольшой код на основе C # DI / TDD / EF. Первый проект:
Корень композиции: 20 интерфейсов с 10 методами (в среднем) на каждый интерфейс. Хорошо, это, вероятно, слишком много методов для интерфейса, но, к сожалению, они часто имеют тенденцию к увеличению по мере развития кода. Я видел намного больше. Из них 10 являются внутренними службами без какого-либо ввода-вывода (нет базы данных / «чистых» функций в мире функций), 5 являются внутренними службами ввода-вывода (локальные базы данных и т. П.), А последние 5 являются внешними службами (например, внешняя база данных ( s) или что-либо еще, что вызывает некоторые удаленные сторонние службы).
Каждый интерфейс имеет реализацию производственного уровня с 4 внедренными интерфейсами (в среднем) и использует 5 членов каждого интерфейса в общей сложности 20 методов (в среднем), используемых для реализации.
Существует несколько уровней тестов: модульные тесты, интеграционные тесты (два уровня), приемочные тесты.
Модульные тесты: все вызовы моделируются с помощью соответствующей настройки макета (с использованием некоторого стандартного инструмента, такого как Moq, например). Итак, есть как минимум 20 * 10 = 200 юнит-тестов. Обычно их больше, потому что тестируются несколько различных сценариев.
Интеграционные тесты (уровень 1): все внутренние сервисы без ввода-вывода являются реальными, все внутренние сервисы, связанные с вводом-выводом, являются фальшивками (обычно в БД в памяти), а все внешние сервисы проксируются на некоторые фальшивые / фиктивные. По сути, это означает, что все внутренние службы ввода-вывода, например SomeInternalIOService: ISomeInternalIOService, заменяются на FakeSomeInternalIOService: ISomeInternalIOService, а все внешние службы ввода-вывода, например SomeExternalIOService: ISomeExternalIOService, заменяются на FakeSomeExternalIOService: ISomeExternalIOService. Таким образом, существует 5 поддельных внутренних операций ввода-вывода и 5 поддельных внешних операций ввода-вывода и примерно такое же количество тестов, как указано выше.
Интеграционные тесты (уровень 2): Все внешние сервисы (включая теперь связанные с локальной базой данных) являются реальными, и все внешние сервисы проксируются к некоторым другим фальшивым / ложным сообщениям, которые позволяют тестировать сбои внешних сервисов. По сути это означает, что все внешние службы ввода-вывода, такие как SomeExternalIOService: ISomeExternalIOService, заменяются на BreakableFakeSomeExternalIOService: ISomeExternalIOService. Существует 5 различных (хрупких) внешних поддельных услуг ввода-вывода. Допустим, у нас около 100 таких тестов.
Приемочный тест: все реально, но файлы конфигурации указывают на некоторые «тестовые» версии внешних сервисов. Допустим, таких тестов около 50.
Интересно, как это перешло бы в мир F #. Очевидно, что многие вещи будут очень разными и некоторые вещи могут даже не существовать в мире F # !
Большое спасибо!
PS Я не ищу точного ответа. Было бы достаточно «направления» с некоторыми идеями.