You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单元测试用例中从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 14:36:05