单元测试遗留C#代码

时间:2011-01-19 17:50:20

标签: c# unit-testing nunit legacy-code

如何为这样的方法编写NUnit测试。这种方法本身是否需要重构? 在leagacy代码中处理这样的场景的最佳方法是什么?

         public bool DoXYZ()
            {
                ABC abc= new ABC()
                XYZ xyz = new XYZ();
                if (xyz .IsSomeCondition(Session.SessionID))
                { return false; }
                else
                { return abc.IsSomeOtherCondition(SessionID.SessionID); }
            }

4 个答案:

答案 0 :(得分:3)

您可能需要重构它以引入依赖注入的钩子。例如,包含DoXYZ方法的类可以获取ABC和XYZ的新属性。这些属性可以默认为ABC和XYZ的实例,但在单元测试中可以用模拟版本替换。

如果您更喜欢使用IoC,这种方法也支持

答案 1 :(得分:1)

我肯定会重构通过参数注入会话ID - 否则你必须手动创建会话。

可以静态吗?看起来像,特别是如果你注入sessionid。

此外,与IoC相比,您实现的(短)命令调度程序通常被认为是反模式(参见上面的Joel Martinez的回答)。

答案 2 :(得分:1)

您有两种选择:

  • 重构您的代码并使用依赖注入,正如Joel和Chris建议的那样。这可能涉及大量工作,但它会使您的代码干净且易于测试。
  • 使用高级框架将非注入依赖项模拟为asked in this question

使用大型遗留代码的方法可能是使用这两种方法。

您还可以从MSDN杂志中查看this article

答案 3 :(得分:0)

鉴于问题中混淆了代码,我只能提供一些指示

  • 我看到2条路径 - 所以最少需要2个单元测试。
  • 在方法中创建协作者通常会很麻烦。将依赖项作为ctor / method参数传递。这允许您派生伪造和操纵分支(例如,使xyz.IsSomeCondition为此测试返回false)。如果ABC和XYZ是易于设置的简单类,那么它可能不是一个直接的问题..你现在可以没有Extract Parameter重构。
  • 将sessionId解压缩为参数以消除静态(全局)变量访问,该访问通常保留其先前的值,从而导致测试之间存在依赖关系

public bool DoXYZ(ABC abc, XYZ xyz, Guid sessionId) 
{    if (xyz.IsSomeCondition(sessionId))    
        return false; 

     return abc.IsSomeOtherCondition(sessionId);  
}