摘要对象重构

本文关键字:重构 对象 | 更新日期: 2023-09-27 18:15:59

我有一个摘要对象,它的职责实际上是将很多东西组合在一起并创建一个摘要报告,然后将其序列化到XML中。在这个对象中,我有很多这样的结构:

public class SummaryVisit : Visit, IMappable
{
    public int SummaryId { get; set; }
    public int PatientId { get; set; }
    public int LocationId { get; set; }
    public IMappable Patient
    {
        get
        {
            return new SummaryPatient(PatientBusinessService.FindPatient(this.PatientId));
        }
    }
    public IMappable Location
    {
        get
        {
            return new SummaryLocation(LocationBusinessService.FindLocation(this.LocationId));
        }
    }
    public IEnumerable<IMappable> Comments
    {
        get
        {
            return new SummaryComments(CommentBusinessService.FindComments(this.SummaryId, Location));
        }
    }
    // ... can be a lot of these structures
    // ... using different business services and summary objects
    public IEnumerable<IMappable> Tasks
    {
        get
        {
            return new SummaryTasks(TaskBusinessService.FindTasks(this));
        }
    }
}

PatientBusinessService、LocationBusinessService等是静态的。每个SummaryPatient, SummaryLocation等内部都有相同类型的结构。

重构和单元测试的最佳方法是什么?

尝试用通过接口代理的调用替换静态调用(或将静态重构为非静态类&接口),但是这个类有很多这样的接口作为构造函数注入的东西,并且开始变得超级贪婪。此外,这些接口内部有一个一次性使用的方法(如果我要创建它只是为了这个总结的需要)。

当这是一个摘要对象时,通常这个静态服务只用于整个结构获得适当的输出属性。

摘要对象重构

您可以将您的测试更改为更具集成性(同时测试多个类)。您可以尝试修改您的服务,使其更加通用,并能够从不同的来源(如TestDataProvider和您当前的数据提供者)获取数据。

我认为更好的解决方案是修改你要测试的类:

  1. 为属性使用强类型并获得所有好处。我认为你应该返回更具体的类型,而不是IMappable

  2. 看起来你的一些数据是存储在类(id)一些数据不是(IMappable对象引用)。我将对其进行重构,以保存对类内部对象的引用:

    private SummaryPatient _patient;
    public SummaryPatient Patient
    {
        get
        {
            if (_patient == null)
                _patient  = new SummaryPatient(PatientBusinessService.FindPatient(this.PatientId));
            return _patient;
        }
    }
    

然后,您可以在构造函数中分配测试数据或创建静态方法CreateDummy(...),仅用于单元测试。这个方法应该为子对象使用CreateDummy。您可以在单元测试中使用它。