7

我想使用 www.eventstore.org 编写一些集成测试来测试我是否能够序列化一些域事件并将它们附加到流中,并检索它们并反序列化它们等。

我一直在试图找出人们通常是如何做到这一点的,我读了一些 Greg Young 关于不同方法的回答(有点过时):

  1. 每次执行集成测试时,我都可以生成不同的流,但我不想这样做,也不想用测试数据污染事件存储
  2. 我可以使用内存中的事件存储。

第二个选项似乎很理想,因为我可以简单地运行一个干净的事件存储,运行我的测试并在最后停止服务器,以便所有数据都消失了。

我已经看到可以使用一个参数来运行事件存储服务器,--mem-db而不是在磁盘中保留任何内容。

问题是:如果运行集成测试的操作系统很可能没有安装事件存储二进制文件,因此没有真正的事件存储服务器可以在内存中运行,那么如何在运行集成测试时使用内存中的事件存储?我不希望我的测试仅仅因为没有在执行测试的机器上安装和启动并运行事件存储而失败。

我知道市场上的一些数据库有一些 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,因此我通过启动事件存储服务(容器)来运行事件存储的集成测试,该服务将在持续集成步骤结束后立即终止。

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:(2019 年 6 月 21 日)netstandard 2.0 中仍然不支持嵌入式客户端,因此我无法使用它来启动内存节点以进行测试。然而,这里有另一个使用 docker 的选项

EventStore C# API 现在也在 nuGet EventStore.Client 中(当前为 5.0.1)

4

0 回答 0