Я хотел бы написать несколько интеграционных тестов, используя www.eventstore.org, чтобы проверить, что я могу сериализовать некоторые доменные события и добавить их в поток, получить их и десериализовать их и т. Д.
Я пытался выяснить, как люди обычно делают это, и я прочитал ответ Грега Янга (немного устаревший) о разных подходах:
- Я мог генерировать разные потоки каждый раз, когда выполняю свои интеграционные тесты, но я предпочитаю не делать этого и не загрязнять хранилище событий тестовыми данными
- Я мог бы использовать хранилище событий в памяти.
Второй вариант кажется идеальным, потому что ямог бы просто запустить чистое хранилище событий, запустить мои тесты и остановить сервер в конце, чтобы все данные исчезли.
Я видел, что можно запустить сервер хранилища событий с параметром --mem-db
ничего не сохранять на диске.
Вопрос в том, как использовать хранилище событий в памяти при выполнении интеграционных тестов, если, скорее всего, ОС, в которойsts работает, не установлены двоичные файлы хранилища событий, и, следовательно, нет реального сервера хранилища событий для запуска в памяти?Я не хочу, чтобы мои тесты проваливались только потому, что на компьютере, на котором выполняются тесты, не установлено и не работает хранилище событий.
Я знаю, что в некоторых базах данных на рынке есть какой-то пакет nuGet, содержащий тот же механизм БДиспользуется в производстве, но в качестве БД в оперативной памяти, поэтому для выполнения тестов на компьютере не требуется «настоящий» сервер.Все двоичные файлы находятся в DLL, доступной для проекта.
Я попытался найти ответы на некоторые вопросы о том, доступно ли что-то подобное для хранилища событий.Я читал некоторые комментарии людей, рассказывающих о каком-то API-интерфейсе для встроенного клиента, но документация, которую я нашел, не очень ясна.В других комментариях упоминается что-то под названием MiniNode, но, опять же, потоки предполагают слишком много и еще не нашли четкого описания того, что это такое или как я могу использовать для своих тестов.
В общем, кто-нибудь может предоставитьПример интеграционного теста (если возможно, xUnit), когда IEventStoreConnection
использует хранилище событий в памяти, где вообще не установлено хранилище событий?
ОБНОВЛЕНИЕ 1 : я пыталсядобавьте зависимость nuGet EventStore.Client.Embedded , чтобы поиграть с ней на всякий случай, если это было то, что мне было нужно.Но у него нет поддержки DotNetCore (стандарт 2.0), поэтому я не могу сказать.Затем я прочитал эту ClientAPI.NetCore проблему , где кто-то предлагает использовать другой подход к тестированию, который использует Chocolatey для захвата EventStore
, а затем выполнить из кода EventStore.ClusterNode
(я бы сделал этос флагом --mem-db
).Я не уверен, что мне это нравится, по крайней мере, не больше, чем использование Docker для той же цели.Мне все еще интересно, есть ли альтернатива?
ОБНОВЛЕНИЕ 2 Поскольку я использую gitlab, я запускаю свои интеграционные тесты в Event Store, раскручивая службу хранилища событий (контейнер), которая прекратит работукак только завершится этап непрерывной интеграции.
integration-tests:
image: my-images-repo/my-gitlab-runner-dotnet-core:latest
stage: integration-tests
services:
# add event store service
- eventstore/eventstore:release-4.1.1-hotfix1
variables:
# event store service params testing with standard ports
EVENTSTORE_INT_TCP_PORT: "1113"
EVENTSTORE_EXT_TCP_PORT: "1113"
EVENTSTORE_INT_HTTP_PORT: "2113"
EVENTSTORE_EXT_HTTP_PORT: "2113"
EVENTSTORE_EXT_HTTP_PREFIXES: "http://*:2113/"
script:
- dotnet restore --no-cache --force
- dotnet build --configuration Release
- dotnet vstest *IntegrationTests/bin/Release/**/*IntegrationTests.dll
Это еще не ответило на мой вопрос, но это решение для моих нужд.
ОБНОВЛЕНИЕ 3: (21 июня2019) В netstandard 2.0 все еще не поддерживается встроенный клиент, поэтому я не могу использовать его для запуска узла в памяти в целях тестирования.Однако есть еще один вариант использования докера, описанный здесь
Также API-интерфейс EventStore C # теперь находится в nuGet EventStore.Client (в настоящее время 5.0.1)