【问题标题】:.Net Core DynamodDB unit testing with XUnit.Net Core DynamodDB 使用 XUnit 进行单元测试
【发布时间】:2018-10-12 17:37:58
【问题描述】:

使用 C#、.net core 2.0、dynamo db

我有我的 web api,它与我的 dynamo db 数据库交互,同时具有 Get 和 Post 方法。

方法示例:

    [HttpGet("api/data")]
    public async Task<List<string>> GetAllData(string userId, string type, string status)
    {
        var creds = new BasicAWSCredentials(awsId, awsPassword);
        var dynamoClient = new AmazonDynamoDBClient(creds, dynamoRegion);
        var context = new DynamoDBContext(dynamoClient);
        List<ScanCondition> conditions = new List<ScanCondition>();
        conditions.Add(new ScanCondition("UserId", ScanOperator.Equal, userId));
        conditions.Add(new ScanCondition("Type", ScanOperator.Equal, type));
        conditions.Add(new ScanCondition("Status", ScanOperator.Equal, status));

        var results = await context.ScanAsync<Common.Job>(conditions, new DynamoDBOperationConfig() { OverrideTableName = MyDynamoTable }).GetRemainingAsync();
        return results.Select(x => x.UpdatedBy.ToLower()).ToList();
    }

现在我想为我的 api 方法编写单元/集成测试。早些时候我使用过 NUnit,但使用 .net core 2.0 我相信我们必须使用 XUnit:https://xunit.github.io/docs/getting-started-dotnet-core

在我的项目中设置 Xunit 应该不是问题。

我想知道如何在这里编写涉及 dynamo db 的测试。这是我第一次在这里使用任何 AWS 服务。

所以基本上我需要知道如何模拟 aws 连接、发电机数据库,然后使用上面我的方法中显示的各种参数。

我找不到有关此主题的更多详细信息或任何较早的有用帖子,因此在此处发布。


如果 aws dynamo db 部分不可测试。任何人都可以分享 xunit 测试的示例,我们可以在其中测试参数并查看预期结果吗?

【问题讨论】:

  • 有人输入吗?

标签: amazon-web-services asp.net-core .net-core amazon-dynamodb xunit.net


【解决方案1】:

AWS SDK 使用接口。您可以轻松模拟接口IAmazonDynamoDB。但是尝试使用依赖注入来做到这一点。好多了。

类似

private readonly IAmazonDynamoDB dynamodbClient;
private readonly IDynamoDBContext context;

public MyDynamodbHandler(IAmazonDynamoDB client)
{
    this.dynamodbClient = client;
    this.context = new DynamoDBContext(client);
}

[HttpGet("api/data")]
public async Task<List<string>> GetAllData(string userId, string type, string status)
{

    List<ScanCondition> conditions = new List<ScanCondition>();
    conditions.Add(new ScanCondition("UserId", ScanOperator.Equal, userId));
    conditions.Add(new ScanCondition("Type", ScanOperator.Equal, type));
    conditions.Add(new ScanCondition("Status", ScanOperator.Equal, status));

    var results = await this.context.ScanAsync<Common.Job>(conditions, new DynamoDBOperationConfig() { OverrideTableName = MyDynamoTable }).GetRemainingAsync();
    return results.Select(x => x.UpdatedBy.ToLower()).ToList();
}

所以每个函数都使用注入的IAmazonDynamoDB。你所要做的就是在开始时模拟这个实例

比如 dynamodbClientMock = new Mock();

然后使用这个mock来启动MyDynamodbHandler类

var dynamodbHandler = new MyDynamodbHandler(dynamodbClientMock);
dynamodbHandler.GetAllData();

【讨论】:

  • 我们如何/在哪里定义凭据,客户需要的区域。您能否提供一个包含此模拟的示例和示例测试用例。谢谢
  • 我们如何使用这种方法从模拟中获取虚假数据?
  • 是的,您可以模拟 IAmazonDynamoDB 的接口,但是您的代码不执行或根本模拟 DynamoDBContext。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多