4

通过对数百行 F# 代码进行单元测试,我意识到不仅检查输出而且检查签名都是有利的。原因是如果代码已针对发布进行验证,然后在发布后修改签名进行更改,人们会想知道签名更改的原因,以便可以为新签名更新测试用例或标记改变为引起问题。

是否可以创建一个测试用例来验证签名?如果是这样,怎么做?

4

2 回答 2

2

我认为最好的方法是简单地提供覆盖签名范围的测试用例。例如,要验证返回类型是否为int

let x:int = someFunc() //you'll get a compiler error if the return type changes

真的,我希望仅仅通过详尽地测试您的公共 API,您就必须测试签名。尤其是在像 F# 这样的语言中,它具有相对严格的静态类型系统。

我想你也可以冒险使用反射来断言签名,但老实说,我认为这不是一个很好的时间投资。

于 2012-10-01T15:15:30.143 回答
2

正如斯蒂芬所说,如果您为代码编写一些单元测试,单元测试通常会使用函数所需类型的值调用函数,因此也会自动检查签名(如果您更改签名,您将无法编译您的测试)。

另一种适用于库的替代方法是使用 F# 接口文件 ( .fsi)。接口文件在实现文件 ( .fs) 中指定了公共函数的类型,它也是文档的好地方。

如果您随后(不小心)更改了实现的类型,除非您更新接口文件中的类型,否则您的代码将无法编译。

您可能希望手动维护接口文件(请参阅 F# 库源以获得一个很好的示例),但您可以通过使用--sig:mylibrary.fsi. 您可能会使用此开关来自动化测试(并在每次编译后检查签名文件之间的差异)。

于 2012-10-01T15:54:37.127 回答