单元测试遗留C#代码

单元测试遗留C#代码,c#,unit-testing,nunit,legacy-code,C#,Unit Testing,Nunit,Legacy Code,如何为这样的方法编写NUnit测试。这个方法本身是否值得重构? 在leagacy代码中,处理此类场景的最佳方法是什么 public bool DoXYZ() { ABC abc= new ABC() XYZ xyz = new XYZ(); if (xyz .IsSomeCondition(Session.SessionID))

如何为这样的方法编写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); }
            }

您可能需要对其进行重构,以引入用于依赖项注入的挂钩。例如,包含DoXYZ方法的类可以获得ABC和XYZ的新属性。这些属性可以默认为ABC和XYZ的实例,但是在单元测试中可以用模拟版本代替


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

我肯定会重构,通过参数注入会话id,否则您必须手动创建会话

它可以是静态的吗?看起来是这样的,特别是如果您注入sessionid

此外,您正在实现一个(短)命令分派器,与IoC相比,它通常被认为是一种反模式(参见上面Joel Martinez的回答)。

您有两个选择:

  • 按照Joel和Chris的建议,重构代码并使用依赖注入。这可能涉及很多工作,但它将使您的代码干净且易于测试
  • 使用高级框架将非注入依赖项模拟为
使用大型遗留代码的方法可能是使用这两种方法


您也可以从MSDN杂志上查看。

鉴于问题中的模糊代码,我只能提供一些提示

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


如果不显示更多代码,就无法回答此问题。什么是
会话
?什么是
SessionID
?包含类是什么样子的?您首先需要知道这个类做什么。知道您可以编写一个测试来验证此方法是否正在执行它应该执行的操作。顺便说一句,我同意其他人的看法,你应该使用一些依赖注入,这样你就可以模仿ABC和XYZ。你应该明确地阅读以下书籍:有趣的文章……我以前从未听说过Pex。
public bool DoXYZ(ABC abc, XYZ xyz, Guid sessionId) 
{    if (xyz.IsSomeCondition(sessionId))    
        return false; 

     return abc.IsSomeOtherCondition(sessionId);  
}