gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:08:12 26 4
gpt4 key购买 nike

我在十多年的旧代码中有以下逻辑,我必须为其编写单元测试。它是一个具体的类,下面的逻辑在构造函数中。有没有一种为此类遗留代码编写单元测试/模拟的好方法。我正在使用 MSTest/RhinoMocks 框架和 VS 2010 IDE 以及 .Net framework 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
}
}
}

最佳答案

单元测试遗留代码很棘手。通常,您必须先重构才能编写单元测试。你最好的选择是非常小的重构步骤,一个一个地提高可测试性,同时让被测试的类处于“工作”状态。我会推荐:

1.) 引入“感知”变量,允许您在关键位置(即在 DB 调用之前和之后)验证被测类的内部状态。这将允许您编写测试来验证类的当前行为(基于公共(public)感知变量),而无需进行太多重构。根据这些测试验证类的行为并开始重构。传感变量是临时的,应该在完成重构后删除。他们只是在那里能够同时编写测试,因此您可以安全地进行重构。

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

另外,我建议您拿起一份 Working Effectively with Legacy Code其中详细描述了这种逐步重构,尤其是依赖性破坏技术。

关于C# - 单元测试/模拟 - 遗留代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7312504/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com