在本文中,我将指导您完成 MongoDB 的 C# 测试容器!当我不想考虑管理启动和拆除数据库的开销或管理云中的某些内容时,我喜欢使用 Testcontainers 进行本地数据库工作。 MongoDB 也不例外,因为我们为 MongoDB 提供的 C# Testcontainers NuGet 包是一个梦想。
在本文中,我将向您介绍测试容器的基础知识。从那里,我将演示通过 C# MongoDB.Driver NuGet 包与新创建的数据库交互是多么简单 - 几乎就像您甚至不知道有一个容器正在启动一样!让我们深入探讨一下。
Testcontainers 是一个很棒的 NuGet 包,可以在构建 .NET 应用程序时极大地增强您的测试和本地开发工作流程。它提供了一种简单有效的方法来管理 Docker 容器,允许您启动轻量级且隔离的实例,并像从未发生过一样将它们拆除!
这意味着使用 Testcontainers,您不再需要担心设置和拆除测试数据库或处理复杂的配置文件。它处理容器管理的所有细节,使这个过程感觉微不足道——我肯定不想手动处理这个问题。
测试容器的一些主要优点包括:
在本文中,我们将重点关注如何将 C# 测试容器用于 MongoDB。这里介绍的大部分建议也适用于其他服务,尤其是数据库,但我们将把目光集中在 MongoDB 上。
要开始使用 C# 中的测试容器,您需要在项目中安装和配置必要的依赖项。请按照以下步骤使用 C# 设置 MongoDB 的测试容器。
通常,第一步是在 C# 项目中安装 Testcontainers NuGet 包。您将打开 NuGet 包管理器控制台,然后运行以下命令:
Install-Package Testcontainers
然而,我们需要这个包的 MongoDB 风格(在撰写本文时我使用的是 3.8.0 版本),其中包括基本的 Testcontainers 包。您可以通过包管理器用户界面或使用以下命令安装它:
Install-Package Testcontainers.MonogoDB
安装 Testcontainers 后,您需要为 MongoDB 配置它。这涉及到使用所需的设置来设置 MongoDB 容器。以下是如何在 C# 中为 MongoDB 配置测试容器的示例:
using Testcontainers.MongoDb; MongoDbContainer container = new MongoDbBuilder() .WithImage("mongo:latest") .Build();
在上面的示例中,我们创建了MongoDbBuilder
的新实例,并指定 MongoDB 映像和端口绑定。 WithImage
方法设置 MongoDB 容器的镜像,因此使用“mongo:latest”将始终拉取最新镜像。
或者,我们可以使用端口绑定来配置我们想要显式使用的端口:
using Testcontainers.MongoDb; MongoDbContainer container = new MongoDbBuilder() .WithImage("mongo:latest") .WithPortBinding(1337, 27017) .Build();
上面的代码使用WithPortBinding
方法将容器的端口 27017 绑定到主机的端口 1337。我们将在接下来的部分中看到,除非您有绑定端口的特定需要,否则您可以保留此状态。我们可以得到一个动态连接字符串,非常方便!
配置MongoDB的测试容器后,您可以根据需要启动和停止容器。以下是启动和停止容器的代码示例:
启动 MongoDB 容器:
await container.StartAsync();
要停止 MongoDB 容器:
await _container.StopAsync();
请记住,MongoDbContainer 类型可以被释放,因此在准备好时调用DisposeAsync
进行清理。
现在我们已经了解了如何旋转和拆卸容器,那么我们应该如何处理它们呢?我们有很多选择,事实上,限制在于您自己的想象力(以及时间、金钱和其他资源……)!
大多数人利用 C# Testcontainers 来编写集成或功能测试。例如,您可以将测试容器与 xUnit 或 NUnit 相匹配,并编写与真实数据库交互的测试。
对我来说,我需要将 MongoDB 的 C# 测试容器连接到 BenchmarkDotNet,以便我可以对将记录插入 MongoDB 进行基准测试!在类似的用例中,我需要临时本地数据库,但不一定用于测试框架。
无论如何,我们需要能够从 C# 连接到这些 MongoDB 数据库容器,接下来的小节将介绍这一点。
假设您阅读了前面的部分,并且为测试容器安装了正确的 MongoDB 包。如果您浏览了本节,请返回阅读并获取正确的软件包。否则,您会为为什么找不到正确的依赖项而摸不着头脑!
您还需要安装 MongoDB.Driver NuGet 包。这就是我们将用来建立与我们启动的数据库容器的连接的方法。如果您想了解有关 MongoDB.Driver 一般工作原理的更多说明,您可以阅读我的其他文章:
准备好正确的包后,我们可以将之前看到的代码与一些 MongoDB 驱动程序代码结合起来,将所有内容粘合在一起:
using MongoDB.Bson; using MongoDB.Driver; using Testcontainers.MongoDb; MongoDbContainer container = new MongoDbBuilder() .WithImage("mongo:latest") .Build(); await container.StartAsync(); string connectionString = container.GetConnectionString(); MongoClient mongoClient = new MongoClient(connectionString); IMongoDatabase database = mongoClient.GetDatabase("test"); IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("test");
在上面的示例中,我们可以在 Testcontainers 中新启动的 MongoDB 容器上调用GetConnectionString()
。最棒的是,无论您如何使用我们在此代码和本文前面看到的构建器模式配置 MongoDB 的 Testcontainer, GetConnectionString()
都会为您提供连接所需的内容。
由于MongoClient
将连接字符串作为单个参数,因此访问 MongoDB 数据库并立即开始使用它非常简单!
现在我们已经设置了 MongoDB Testcontainer 并且有一个MongoClient
连接到它,我们可以开始对其执行 CRUD 操作。容器实例提供的连接详细信息使得将这两件事结合起来变得轻而易举,而且实际上,我们可以只关注 CRUD 的 MongoDB.Driver 方法调用。
下面是执行简单 CRUD 操作的示例:
// using code from earlier examples... // Create await collection.InsertOneAsync(new BsonDocument() { ["Name"] = "Nick Cosentino", }); // Read var filterBuilder = Builders<BsonDocument>.Filter; var filter = filterBuilder.Eq("Name", "Nick Cosentino"); var results = collection.Find(filter); // Update var updateBuilder = Builders<BsonDocument>.Update; var update = updateBuilder.Set("Name", "Dev Leader"); collection.UpdateOne(filter, update); // Delete filter = filterBuilder.Eq("Name", "Dev Leader"); collection.DeleteOne(filter);
使用前面的代码片段,我们已经启动并运行了 MongoDB 容器实例和MongoClient
。因此,您可以在上面的代码片段中看到,我们可以直接使用从之前的设置中获得的IMongoCollection<BsonDocument>
。
这有助于说明,一旦您通过 Testcontainers 启动并运行 MongoDB docker 容器,一旦连接到它,您就不必以任何特殊方式对待事物!
总而言之,C# Testcontainers for MongoDB 是一种非常简单的方法,可以让瞬态 MongoDB 数据存储启动并运行以进行测试和开发。虽然本文并未重点关注特定用例,但希望您能够更好地理解在 Testcontainers 之上分层 MongoDB 驱动程序以与 MongoDB 交互的感觉是多么透明。
鉴于 C# Testcontainers 消除了设置、拆卸甚至连接字符串管理的麻烦,如果您想启动并运行 MongoDB 以供本地使用,这是我的一个简单推荐。
如果您发现这很有用并且正在寻找更多学习机会,请考虑订阅我的免费每周软件工程时事通讯,并在 YouTube 上观看我的免费视频!
也发布在这里