gpt4 book ai didi

c# - 如何使用/复杂数据交互测试函数

转载 作者:行者123 更新时间:2023-11-30 18:04:21 25 4
gpt4 key购买 nike

目前,我正在开发一个系统,该系统执行相当多的报告式函数,这些函数使用许多不同的数据点并将它们转换为更大的、有时是扁平化的输出。我的大部分应用程序都是基于存储库模式的变体构建的。因此,我有一套用于测试场景的模拟存储库。我遇到的问题是这些数据点之间的交互非常复杂,以至于维护“模拟数据”很快就变成了一场维护噩梦。这是一个模拟示例:

public class SomeReportingEntity
{
private IProductRepo ProductRepo;
private IManagerRepo ManagerRepo;
private ILocationRepo LocationRepo;
private IOrdersService OrdersService;
private IEmployeeRepo EmployeeRepo;

public ReportingEntity(IProductRepo ipr, IManagerRepo imr, ILocationRepo ilr, IOrdersService ios,
IEmployeeRepo ier){
//Load these to private vars...
}

//This is the function that I want to test...
public SomeReportingEntity GetManagerSalesByRegionReport()
{
//Make a complex join on all sub collections. These
//sub collections are all under test individually.
var MangerSalesByRegionItems = From x in ProductRepo.CurrentProducts()
Join y in OrdersService.FutureOrders() On ...
Join z in EmployeeRepo.ActiveEmployees() On ...
Join a in LocationRepo.GetAllRegions() On ...
Join b In ManagerRepo.GetActiveManagers On ...
Select new SomeReportingEntity() With { ... }

return MangerSalesByRegionItems.ToList();
}

不可否认,这是一个非常人为的例子,但我想强调的基本思想是我有几个我正在加入的存储库,我需要创建许多测试以确保这个复杂的查询按预期进行。由于加入操作非常复杂,这使得模拟数据很难保持一致 - 特别是当我必须添加更多关联并测试额外点时。此外,我需要能够将特定的记录状态输入到模拟中(例如缺少指定经理的员工)以验证查询是否适本地处理了这些情况。

所以这是我的问题:

  1. “模拟”这些数据的最佳方式是什么,这样它就不会成为一场噩梦?我有很多人建议构建一个内存数据库来支持这一点。
  2. 我真的遇到架构问题了吗?在报告场景中,我发现自己经常处于这种模式中,我将许多分离的数据点合并到一个新的混合实体中。随着 Linq 的出现,它很容易做到并且意图很清晰,但有时感觉我有点作弊。

最佳答案

您要做的第一件事是创建知道如何为不同存储库检索数据的集中对象。因为这只是报告,所以更容易,因为您不必担心更改跟踪。

从后勤的角度来看,我会考虑的一件事是制作一个本地数据库来保存远程数据(使用代理定期更新)。这将消除调用远程服务和即时聚合数据的一些问题。您还可以在开始时预处理一些数据。

当我使用存储库模式时,我将它与 Unit Of Work pattern 结合在一起.工作单元是为你做所有跑腿工作的人。理论上,您的 UoW 可以从多个服务中引入数据,并根据配置将其呈现给存储库。

为了进行测试,您可以使用 InMemoryUnitOfWork 在一个地方提供所有数据。

关于c# - 如何使用/复杂数据交互测试函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6256866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com