如何为遗留代码编写测试然后重构它?

时间:2015-07-07 18:23:49

标签: c# unit-testing refactoring tdd

我有一个项目,其中包含许多我以前写过的丑陋代码。现在,我试图使其可测试并使用TDD进行进一步开发。但每次我尝试为现有代码编写单元测试时,我都会陷入困境。我只是不知道如何测试我的旧代码。我不能写任何小测试。这让我感到恶心。所以任何人都可以告诉我为这样的函数编写哪些测试来进一步重构无痛:

public void ChangeHealth(UInt16 id, HealthTypes health, FighterCount count)
{
    var uc = new FighterCommand {Health = health, KillerId = 1024};
    Fighter f;
    switch(count)
    {
        case FighterCount.All:
            if (Fight.GetInstance().Status == FightStatuses.Enable)
            {
                foreach (var u in Fighters.Elements)
                    uc.AddUnit(u.Id);
            }
            FightEvents.StatusUnit(null, health);
            _sender.SendCommand_AppServer(uc);
            break;
        case FighterCount.NotEqual:
            for (var i = Fighters.Count - 1; i >= 0; i--)
            {
                f = Fighters.GetUnit(i);
                if (health == f.Health) continue;
                uc.AddUnit(f.Id);
                FightEvents.StatusUnit(f, health);
            }
            if (uc.UnitCount > 0) _sender.SendCommand_AppServer(uc);
            break;
        default:
            f = Fighters.GetById(id);
            uc.AddUnit(f.Id);
            FightEvents.StatusUnit(f, health);
            _sender.SendCommand_AppServer(uc);
            break;
    }
}

1 个答案:

答案 0 :(得分:3)

看看Michael Feathers的“黄金大师”技巧。这个想法是你输入不可测试的代码,记录输出或程序的状态。然后,您可以重构并抛出相同的输入并观察相同的输出或内部状态(除了您所做的次要增量更改)。代码逐位变得更加可测试。进一步深入解释http://blog.thecodewhisperer.com/2014/09/28/surviving-legacy-code-with-golden-master-and-sampling/

用于转储应用程序状态的工具是https://github.com/kbilsted/StatePrinter,您只需说出

即可
var printer = new Stateprinter();
Console.WriteLine( printer.PrintObject( myProgram) );