F#:如何测试另一个项目的内部模块?

问题描述

我遵循.Net documentation中的最佳F#做法:

  • 我为应用程序创建一个项目(控制台,而不是库)
  • 我为测试创建了一个项目(使用Expecto,但没关系)

问题:我的某些应用程序模块未通过internal关键字公开。因此,我无法将这些模块导入我的Tests项目中。

=>如何对这些模块进行单元测试?我应该删除内部访问控制吗?

谢谢!

解决方法

要测试internal,可以使用InternalsVisibleTo,以测试私有类,可以链接测试项目中的文件(当您在“添加文件”对话框中时,可以选择链接,而不是打开)。

但是,正如已经提到的,通常只测试公共接口。但有时您也想分别测试复杂的内部结构。例如,在.NET运行时库中,通常这样做(内部有很多复杂的内部函数),并且它们经常使用链接方法。

由于私有实际上意味着该类是私有的,并且您甚至无法通过扩展方法访问此类成员,因此您应将这些成员作为公共成员放在自己的私有类中。这样,当您链接时,该类以及成员也可以访问,但是在您的生产版本中都不能访问。

请谨慎使用此技术,因为它将把您的私人详细信息绑定到测试系统,并且您将不能随意更改内部实现。