如何模拟 DynamodbContext BatchWrite 以在网络中进行单元测试

问题描述 投票:0回答:2

我有一个使用 DynamoDbContext 在 DynamoDb 表中添加项目的方法。

var batchWriteObj = context.CreateBatchWrite<myDynamoDBModel>
                                            (new DynamoDBOperationConfig { TableNamePrefix = "abc" });
                    batchWriteObj.AddPutItem(myDynamoDBModel);

我想在我的单元测试中测试这一部分。 由于 BatchWrite 没有任何构造函数,而且它的属性也不是虚拟的。我无法为其创建模拟。

有什么方法可以测试这段代码吗?也许通过嘲笑 BatchWrite?

c# unit-testing amazon-dynamodb nunit
2个回答
1
投票

您是否考虑过使用 DynamoDB local 来运行测试?它还有一个额外的优点,即验证您的调用是否正在执行您期望的操作。我不久前为其创建了一个帮助程序包 (https://www.nuget.org/packages/Wadsworth.DynamoDB.TestUtilities/)。它只是管理在 Docker 容器中本地启动 DynamoDB。您可以在here查看其来源,其中包括一个示例。


0
投票

我必须为此编写一个简单的包装器。

public interface IBatchWriteWrapper<T>
{
  IBatchWriteWrapper<T> CreateBatchWrite();
  void AddPutItems(List<T> items);
  Task ExecuteAsync(CancellationToken cancellationToken = default);
}

public class BatchWriteWrapper<T>(IDynamoDBContext _dynamoDb) : IBatchWriteWrapper<T>
{
  private BatchWrite<T>? _batchWrite;

  public IBatchWriteWrapper<T> CreateBatchWrite()
  {
    _batchWrite = _dynamoDb.CreateBatchWrite<T>();
    return this;
  }

  public void AddPutItems(List<T> items)
  {
    _batchWrite?.AddPutItems(items);
  }

  public Task ExecuteAsync(CancellationToken cancellationToken = default)
  {
    return _batchWrite?.ExecuteAsync(cancellationToken) ?? Task.CompletedTask;
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.