Aws-sdk-net: 由于缺少接口,无法模拟DynamoDBContext.CreateBatchGet

创建于 2019-09-05  ·  4评论  ·  资料来源: aws/aws-sdk-net


当我尝试为使用DynamoDBContext.CreateBatchGet的代码编写单元测试时,我坚持提供虚假结果。 BatchGet没有公共可用的构造函数,也没有CreateBatchGet使用接口作为返回类型。

预期行为



最简单的方法是添加IBatchGet界面并将其添加为CreateBatchGet的返回类型。 这将允许在使用IDynamoDbContext时轻松提供模拟,并为我的测试返回假数据。

当前行为






批量获取无法实例化,因此我被迫使用DynamoDbContext之类的具体类型。

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返回假数据。

您的环境

  • AWSSDK.DynamoDBv2(3.3.101.59)
breaking-change bug moduldynamodb

最有用的评论

我认为是因为:
https://github.com/aws/aws-sdk-net/blame/231a7e147159cc8e0da023f35001a25ed923d01e/sdk/src/Services/DynamoDBv2/Custom/DocumentModel/Table.cs#L378

as AmazonDynamoDBClient使得无法传递.NET Standard的模拟实例,它将设置为null(这似乎是一个错误,因为有防止在构造函数中传递null的防护措施)。

所有4条评论

我认为是因为:
https://github.com/aws/aws-sdk-net/blame/231a7e147159cc8e0da023f35001a25ed923d01e/sdk/src/Services/DynamoDBv2/Custom/DocumentModel/Table.cs#L378

as AmazonDynamoDBClient使得无法传递.NET Standard的模拟实例,它将设置为null(这似乎是一个错误,因为有防止在构造函数中传递null的防护措施)。

遇到相同的问题,并(基本上)发现了相同的问题:在AmazonDynamoDBClient上使用DescribeTable的受保护版本,而不是使用公共接口覆盖使其无法通过Moq它。 为什么这需要进行重大更改才能解决?

我也遭受这个问题的困扰。 单项操作(LoadAsync / PutAsync)是可模拟的,但它们的批处理对应项却不是,这迫使我们针对DynamoDB Local进行测试。 这对于方案而言并不理想。

在这里也已经提到过https://github.com/aws/aws-sdk-net/issues/1589

此页面是否有帮助?
0 / 5 - 0 等级