通过对数百行 F# 代码进行单元测试,我意识到不仅检查输出而且检查签名都是有利的。原因是如果代码已针对发布进行验证,然后在发布后修改签名进行更改,人们会想知道签名更改的原因,以便可以为新签名更新测试用例或标记改变为引起问题。
是否可以创建一个测试用例来验证签名?如果是这样,怎么做?
通过对数百行 F# 代码进行单元测试,我意识到不仅检查输出而且检查签名都是有利的。原因是如果代码已针对发布进行验证,然后在发布后修改签名进行更改,人们会想知道签名更改的原因,以便可以为新签名更新测试用例或标记改变为引起问题。
是否可以创建一个测试用例来验证签名?如果是这样,怎么做?
我认为最好的方法是简单地提供覆盖签名范围的测试用例。例如,要验证返回类型是否为int
,
let x:int = someFunc() //you'll get a compiler error if the return type changes
真的,我希望仅仅通过详尽地测试您的公共 API,您就必须测试签名。尤其是在像 F# 这样的语言中,它具有相对严格的静态类型系统。
我想你也可以冒险使用反射来断言签名,但老实说,我认为这不是一个很好的时间投资。
正如斯蒂芬所说,如果您为代码编写一些单元测试,单元测试通常会使用函数所需类型的值调用函数,因此也会自动检查签名(如果您更改签名,您将无法编译您的测试)。
另一种适用于库的替代方法是使用 F# 接口文件 ( .fsi
)。接口文件在实现文件 ( .fs
) 中指定了公共函数的类型,它也是文档的好地方。
如果您随后(不小心)更改了实现的类型,除非您更新接口文件中的类型,否则您的代码将无法编译。
您可能希望手动维护接口文件(请参阅 F# 库源以获得一个很好的示例),但您可以通过使用--sig:mylibrary.fsi
. 您可能会使用此开关来自动化测试(并在每次编译后检查签名文件之间的差异)。