繁体   English   中英

C#-单元测试/模拟-旧版代码

[英]C# - Unit Testing/Mocking - Legacy Code

在十多年的老代码中,我必须遵循以下逻辑,我必须为此编写单元测试。 这是一个具体的类,以下逻辑位于ctor中。 有没有一种好的方法可以为此类旧代码编写单元测试/模拟。 我正在使用MSTest / RhinoMocks框架和带有.Net Framework 4.0的VS 2010 IDE

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 
            }
        }
    }

对遗留代码进行单元测试非常棘手。 通常,您必须首先重构才能编写单元测试。 最好的选择是很小的重构步骤,即一步一步地提高可测试性,同时使测试中的类处于“正常”状态。 我建议:

1.)引入“传感”变量,使您可以在关键位置(即,在DB调用之前和之后)验证被测类的内部状态。 这样,您就可以编写测试来验证类的当前行为(基于公共感知变量),而不必进行太多重构。 根据这些测试验证类的行为,然后开始重构。 感测变量是临时的,完成重构后应将其删除。 它们只是在此期间才能够编写测试,因此您可以安全地重构。

2.)逐一替换对具体类的引用,以接口您通过构造函数传递的引用。 对于单例,您有两种选择,一种是让单例返回一个特殊的实例进行单元测试-这需要修改单例实现,但使被测类保持不变。 您可以执行此操作,直到可以重构使用接口依赖关系来替换Singleton。

我也建议您一份《 有效使用旧版代码》的副本,其中详细描述了逐步重构的过程,尤其是打破依赖关系的技术。

除了BrokenGlass所说的之外,您可能还需要考虑编写一些集成测试以确保整个过程正常进行。 例如,如果您的应用程序更新了数据库中的某些行,请编写针对测试数据库的可重复测试,以便在重构并将整个事物分解为松耦合的可测试块时,可以继续确保正确的功能。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM