如何在单元测试用例中从Cosmos DB模拟器读取指定Id的数据
实现Cosmos DB模拟器指定Id数据读取的方案
1. 先修正现有代码的小问题
现有代码中集合Fixture的类名不统一,定义的是DataFixtures,但ICollectionFixture泛型参数写的是DataFixture,会导致测试集合初始化失败,先对齐类名。
2. 补充读取指定Id文档的逻辑
你可以直接复用已经初始化好的DocumentClient实例,调用ReadDocumentAsync方法读取Id为Test的文档,代码修改后的完整示例如下:
// 对齐Fixture类名 public class DataFixture { public DataFixture() { app.CreateDefaultLoggerFactory(); } } [CollectionDefinition("Tabulardata collection")] public class DataCollection : ICollectionFixture<DataFixture> { } [Collection("Tabulardata collection")] public class DataTests { private static readonly string CosmosEndpoint = "https://localhost:8081"; private static readonly string EmulatorKey = "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="; private static readonly string DatabaseId = "Recordings"; private static readonly string RecordingCollection = "testdata"; string Root = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName; // 提取DocumentClient为类成员,复用连接避免重复初始化 private DocumentClient _cosmosClient; private void InitCosmosClient() { _cosmosClient = new DocumentClient(new Uri(CosmosEndpoint), EmulatorKey, new ConnectionPolicy { ConnectionMode = ConnectionMode.Direct, ConnectionProtocol = Protocol.Tcp }); // 用IfNotExists方法避免库/集合已存在时抛出冲突异常 _cosmosClient.CreateDatabaseIfNotExistsAsync(new Database { Id = DatabaseId }).Wait(); _cosmosClient.CreateDocumentCollectionIfNotExistsAsync( UriFactory.CreateDatabaseUri(DatabaseId), new DocumentCollection { Id = RecordingCollection }).Wait(); } // 新增读取Id为Test的文档的方法 private async Task<dynamic> GetTestDocumentAsync() { try { var documentUri = UriFactory.CreateDocumentUri(DatabaseId, RecordingCollection, "Test"); var response = await _cosmosClient.ReadDocumentAsync(documentUri); return response.Document; // 如果是强类型模型,可以替换为泛型调用:await _cosmosClient.ReadDocumentAsync<你的模型类>(documentUri); } catch (DocumentClientException ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound) { // 文档不存在时的自定义处理逻辑,此处示例返回null return null; } } // 测试用例示例 [Fact] public async Task ReadTestDocument_Success() { InitCosmosClient(); var testDoc = await GetTestDocumentAsync(); // 此处补充你的断言逻辑 Assert.NotNull(testDoc); } }
注意事项
- 上述代码适配Cosmos DB V2版本SDK,如果你使用的是V3及以上版本的SDK,对应API需要做对应调整
- 测试执行前请确保Cosmos DB模拟器已经正常启动,端口和配置的
8081保持一致 - 测试结束后建议清理插入的测试数据,避免影响后续测试用例的执行结果
内容的提问来源于stack exchange,提问作者ZZZSharePoint
相关产品推荐
相关产品推荐

