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);
}