首页 > 解决方案 > 重构复杂的构造函数,调用“基础”某些级别的深度

问题描述

最后,我正在阅读很多关于遗留代码以及如何处理它的内容。我有一个示例项目,其中包含编写得很糟糕的代码,我想对其进行重构。

注意:没有适当的测试,所以我想先添加一些测试,以确保我不会因为重构而破坏任何东西,但我不知道如何测试它。

给定以下 ULM 图:

在此处输入图像描述

我想为 Manager 类中的方法编写一个 UT(注意:这些不显示在 ULM 中)。问题是 Manager 类需要一个继承了几个层次的 User 对象。

为简单起见,我并没有完全绘制出整个图,但我们假设“用户”对象的构造函数需要多个参数,并且所有这些参数都表示具有这样一个继承链的对象。我不允许使用 null,因为这些对象在继承级别的某个地方使用,并且当我使用“null”时会抛出“Null Exception”。

我想练习 TDD 以向 Manager 类添加更改,但因此,我首先需要能够构造一个“Manager”类。重构所有其余部分以仅制作 Manager 是不可接受的。

我知道一种技术,它将“用户”参数更改为接口,但是将接口用于“用户”感觉不对。

有什么建议吗?

标签: c#refactoring

解决方案


我认为最简单的解决方案是代理设计模式。您将需要创建一个 ProxyUser ,其中仅包含来自 User 的所需属性和方法(我的意思是只包含 Manager 使用的东西)。然后在您的单元测试中,您可以模拟该 ProxyUser。

public class Manager
{
    public User User {get;set;}
    public void DoSomething()
    {
        Console.WriteLine(User.Name);
    }
}

public abstract class BaseUser
{
    public virtual string Name {get;}
}

public class ProxyUser : BaseUser
{
    private User _realUser;
    public override string Name => _realUser.Name;
}

public class User : BaseUser
{
    public override string Name {get;set;}
}

然后,在您的单元测试中,您模拟 BaseUser


推荐阅读