From 8e3878b9ffc761a31947a3a3ab279be97a717adf Mon Sep 17 00:00:00 2001 From: xiangning Date: Fri, 3 Jul 2026 11:50:15 +0800 Subject: [PATCH] =?UTF-8?q?```=20test(chat):=20=E6=9B=B4=E6=96=B0=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E5=8F=91=E9=80=81=E5=91=BD=E4=BB=A4=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=99=A8=E6=B5=8B=E8=AF=95=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 MongoDB 集合模拟,改为使用真实数据库连接 - 添加本地 MongoDB 测试连接字符串常量 - 在静态构造函数中初始化 MongoDB.Entities 静态连接 - 简化构建处理器方法,移除不必要的 Mock 对象 - 更新注释说明测试策略从模拟转向真实数据库 ``` --- .../Chat/SendMessageCommandHandlerTests.cs | 38 ++++++++----------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/tests/BuildFlow.IM.Tests/Chat/SendMessageCommandHandlerTests.cs b/tests/BuildFlow.IM.Tests/Chat/SendMessageCommandHandlerTests.cs index 1488d6f..871ca40 100644 --- a/tests/BuildFlow.IM.Tests/Chat/SendMessageCommandHandlerTests.cs +++ b/tests/BuildFlow.IM.Tests/Chat/SendMessageCommandHandlerTests.cs @@ -6,8 +6,8 @@ using IM.Infrastructure.Mongo; using IM.Infrastructure.Persistence; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; -using MongoDB.Bson; using MongoDB.Driver; +using MongoDB.Entities; using Moq; using Xunit; @@ -18,6 +18,17 @@ namespace BuildFlow.IM.Tests.Chat; /// public class SendMessageCommandHandlerTests { + /// 本地测试 MongoDB 连接串(与集成测试共用,需本地 docker 起 mongo)。 + private const string MongoConnection = "mongodb://mongo:mongo123@localhost:27017/im_unit_test?authSource=admin"; + + static SendMessageCommandHandlerTests() + { + // MongoDB.Entities 用静态 DB.Default,进程内一次性初始化(幂等)。 + // 消息正文落真实 Mongo,但本测试仅断言未读数语义,不校验 Mongo 内容。 + var dbName = MongoUrl.Create(MongoConnection).DatabaseName!; + DB.InitAsync(dbName, MongoClientSettings.FromConnectionString(MongoConnection)).GetAwaiter().GetResult(); + } + private static readonly Guid SenderId = Guid.Parse("22222222-2222-2222-2222-222222222222"); private static readonly Guid RecipientA = Guid.Parse("30000000-0000-0000-0000-000000000001"); private static readonly Guid RecipientB = Guid.Parse("30000000-0000-0000-0000-000000000002"); @@ -149,32 +160,13 @@ public class SendMessageCommandHandlerTests } /// - /// 构造 Handler,MongoDbContext 用 mock 的 IMongoClient/IMongoDatabase/IMongoCollection 装配, - /// 使 InsertOneAsync 成为可调用的空操作(消息正文落库逻辑在真实 Mongo 上验证,此处聚焦未读数语义)。 - /// - /// - /// 构造 Handler,MongoDbContext 用 mock 的 IMongoClient/IMongoDatabase/IMongoCollection 装配, - /// 使 InsertOneAsync 成为可调用的空操作(消息正文落库逻辑在真实 Mongo 上验证,此处聚焦未读数语义)。 - /// 默认所有接收者视为离线(IOnlinePresenceService.FilterOfflineAsync 返回全部), - /// 以便测试通知链路;个别测试可覆盖 onlinePresence 的行为。 + /// 构造 Handler。Mongo 消息正文落真实库(静态 DB.Default 已在静态构造函数初始化), + /// 此处聚焦未读数语义。默认所有接收者视为离线(驱动通知链路),个别测试可覆盖。 /// private static (SendMessageCommandHandler Handler, Mock UnreadCounter, Mock UserInfo, Mock OnlinePresence, Mock Notification) BuildHandler(ImDbContext db) { var unreadCounter = new Mock(); - var messages = new Mock>(); - // 模拟 InsertOneAsync 生成 ObjectId(真实 Mongo 在写入时分配),便于断言 LastMessageId 被设置 - messages.Setup(m => m.InsertOneAsync(It.IsAny(), null, It.IsAny())) - .Callback((doc, _, _) => - doc.Id = ObjectId.GenerateNewId().ToString()); - var mongoDatabase = new Mock(); - mongoDatabase.Setup(d => d.GetCollection("messages", null)) - .Returns(messages.Object); - var mongoClient = new Mock(); - mongoClient.Setup(c => c.GetDatabase(It.IsAny(), null)) - .Returns(mongoDatabase.Object); - var mongoDb = new MongoDbContext(mongoClient.Object, "im-test"); - var userInfo = new Mock(); userInfo.Setup(u => u.GetUsersAsync(It.IsAny>(), It.IsAny())) .ReturnsAsync(new Dictionary()); @@ -187,7 +179,7 @@ public class SendMessageCommandHandlerTests var notification = new Mock(); var handler = new SendMessageCommandHandler( - db, mongoDb, userInfo.Object, unreadCounter.Object, onlinePresence.Object, notification.Object); + db, userInfo.Object, unreadCounter.Object, onlinePresence.Object, notification.Object); return (handler, unreadCounter, userInfo, onlinePresence, notification); }