当我尝试为使用DynamoDBContext.CreateBatchGet的代码编写单元测试时,我坚持提供虚假结果。 BatchGet
最简单的方法是添加IBatchGet
批量获取
IAmazonDynamoDB client = Substitute.For<IAmazonDynamoDB>();
IDynamoDBContext context = new DynamoDBContext(client, new DynamoDBOperationConfig
{ OverrideTableName = "Abc" });
BatchGet<T> batch = context.CreateBatchGet<T>();
await batch.ExecuteAsync();
完成此操作后,我从SDK内部获取了奇怪的异常,例如
System.NullReferenceException : Object reference not set to an instance of an object.
at Amazon.DynamoDBv2.DocumentModel.Table.DescribeTable(String tableName)
而且我仍然看不到返回结果的简单方法:(
我可以通过添加一些不需要的实体属性来对代码进行一些调整,并且能够解决这个问题,但是随后我要执行批处理,但是仍然没有提供结果的简便方法。 我可以做:
IDynamoDBContext context = Substitute.For<IDynamoDBContext>();
BatchGet<T> batch = context.CreateBatchGet<T>();
await batch.ExecuteAsync();
但是在这种情况下,我找不到通过模拟的IDynamoDBContext或模拟的IAmazonDynamoDB提供虚假数据的简便方法。
我也无法使用其他方法返回假数据
IDynamoDBContext context = Substitute.ForPartsOf<DynamoDBContext>();
BatchGet<T> batch = context.CreateBatchGet<T>(...)
context.ExecuteBatchGetAsync(new BatchGet[] { batch })
因为在这种情况下ExecuteBatchGetAsync公共方法未标记为虚拟方法,所以很难使用例如ovverride该调用。 N替代。
在IDynamoDBContext中为CreateBatchGet添加IBatchGet接口。
(或)在DynamoDBContext中使ExecuteBatchGetAsync虚拟
如果您认为自己需要一个,我可以提供拉动请求:)
编写单元测试,该测试从批处理API返回假数据。
as AmazonDynamoDBClient
使得无法传递.NET Standard的模拟实例,它将设置为null(这似乎是一个错误,因为有防止在构造函数中传递null的防护措施)。
遇到相同的问题,并(基本上)发现了相同的问题:在AmazonDynamoDBClient上使用DescribeTable的受保护版本,而不是使用公共接口覆盖使其无法通过Moq
我也遭受这个问题的困扰。 单项操作(LoadAsync / PutAsync)是可模拟的,但它们的批处理对应项却不是,这迫使我们针对DynamoDB Local进行测试。 这对于方案而言并不理想。
最有用的评论
我认为是因为:
https://github.com/aws/aws-sdk-net/blame/231a7e147159cc8e0da023f35001a25ed923d01e/sdk/src/Services/DynamoDBv2/Custom/DocumentModel/Table.cs#L378
as AmazonDynamoDBClient
使得无法传递.NET Standard的模拟实例,它将设置为null(这似乎是一个错误,因为有防止在构造函数中传递null的防护措施)。