单元测试中的静态类/方法/属性,是否停止

考虑到没有引入不能再次测试的包装器的方法,则不能在单元测试开发环境中使用静态的类/方法/属性?

另一种情况是,在单元测试目标中使用静态成员时,无法模拟静态成员。因此,在测试单元测试目标时,您必须测试静态成员。当静态成员执行计算时,您想隔离它。

回答:

测试静态方法与测试任何其他方法没有什么不同。将静态方法作为 依赖关系 在另一个经过测试的模块中会引发问题(如前所述-

您无法使用免费工具对其进行模拟/存根)。但是,如果静态方法本身已经过单元测试,则可以简单地将其视为有效的可靠组件。

总体而言,在以下情况下,使用静态方法没有任何问题(例如,不会破坏单元测试/ TDD):

  • 这是简单的输入输出方法(各种 “给定的计算”
  • 它是 可靠的 ,也就是说我们已经对它进行了测试,或者来自您认为可靠的第三方来源(例如,Math.Floor可能被认为是可靠的-使用它不应发出 注意 ,这是静态的!” 警告;您可能会假设微软做到了)

静态方法何时会引起问题,应避免使用?基本上,只有当他们与 互动或 (或模拟)的 :

  • 各种文件系统,数据库,网络依赖项
  • 从内部调用的其他(可能是更复杂的)静态方法
  • 您的模拟框架无法正常处理的几乎所有内容

就当静态方法两个例子 使得单元测试硬盘

public int ExtractSumFromReport(string reportPath)

{

var reportFile = File.ReadAllText(reportPath);

// ...

}

你如何处理File.ReadAllText?很显然,这将进入文件系统以检索文件内容,这在单元测试时是主要的禁止。这是具有外部依赖关系的静态方法的示例。为了避免这种情况,通常可以围绕文件系统api创建包装器,或者只是将其作为依赖项/委托注入。

public void SaveUser(User user)

{

var session = SessionFactory.CreateSession();

// ...

}

那这个呢?会话 是非平凡的

依赖关系。当然,它可能是ISession,但是如何强制SessionFactory返回模拟?我们不能。而且我们也无法创建 易于确定的 会话对象。

在上述情况下,最好完全避免使用静态方法。

以上是 单元测试中的静态类/方法/属性,是否停止 的全部内容, 来源链接: utcz.com/qa/399786.html

回到顶部