c# -单元测试/模拟-遗留代码

本文关键字:代码 单元测试 模拟 | 更新日期: 2023-09-27 18:07:45

我在十多年前的代码中有以下逻辑,我必须为其编写单元测试。它是一个具体的类,下面的逻辑在actor中。是否有一种好的方法可以为这些遗留代码编写单元测试/模拟?我正在使用MSTest/RhinoMocks框架和VS 2010 IDE与。net框架4.0

public class SomeClass
    {
        /// ctor
        public SomeClass(XmlNode node)
        {
            //Step 1: Initialise some private variable based on attributes values from the node
            //Step 2: Lot of If , else -if statements ---> something like - 
            if (/*attributeValue is something*/)
            {
                // Connect to Db, fetch  some value based on the attribute value. 
                // Again the logic of connecting and fetching is in another concrete class
            }
            else if (/*attributeValue is somthing else*/)
            {
                // fetch a value by loading a config file (this loading and reading of config file 
                // is again a singleton class where config file path is hardcoded)
            }
            else
            {
                // set some private member variable 
            }
        }
    }

c# -单元测试/模拟-遗留代码

对遗留代码进行单元测试是很棘手的。一般来说,您必须首先进行重构才能编写单元测试。您最好的选择是非常小的重构步骤,一个接一个地提高可测试性,同时使被测类处于"工作"状态。我建议:

1)。引入"感知"变量,允许您在关键位置(即在DB调用之前和之后)验证被测类的内部状态。这将允许您编写测试来验证类的当前行为(基于公共感知变量),而无需进行大量重构。根据这些测试验证类的行为,并开始重构。感知变量是临时的,应该在完成重构后删除。它们的存在只是为了能够在同一时间内编写测试,以便您在某种程度上安全地重构。

2)。逐一将对具体类的引用替换为通过构造函数传递的接口引用。对于singleton,你有两个选择,一个是让singleton返回一个用于单元测试的特殊实例——这需要修改singleton的实现,但是保持被测类不变。你可以这样做,直到你可以重构使用接口依赖来代替Singleton。

我还建议你读一份《有效地使用遗留代码》,它详细描述了这种一步一步的重构,尤其是依赖打破技术。

除了BrokenGlass所说的,您可能想要考虑编写一些集成测试,以确保整个过程正常工作。例如,如果您的应用程序更新了数据库中的一些行,那么针对测试数据库编写可重复的测试,以便在重构并将整个东西分解为松散耦合的可测试块时,您可以继续确保适当的功能。

没有什么比重构一个类,为它写了一堆测试,然后意识到你的重构破坏了应用程序中的其他东西更糟糕的了。