我正在为我的f#库编写单元测试,使用f#, Visual Studio单元测试框架(又名MSTest)和FluentAssertions
测试方法的返回类型应该是void或Task。在c#中这很简单:
[TestMethod]
public void TestMethod1()
{
false.Should().BeFalse();
}
在f#中我有以下内容:
[<TestMethod>]
member this.TestMethod1() =
false.Should().BeFalse(null)
|> ignore
否则返回类型更改为FluentAssertions.PrimitivesBooleanAssertions
,因此Test Runner看不到它。
如何避免在每次测试结束时出现|> ignore
?
这里需要|> ignore
,因为TestMethod1
的签名是从"由内到外"推断出来的。考虑在c#中,方法的返回类型在方法声明中是必需的。这些是两种语言之间的深刻差异。
"Fluent" api在f#中是一个麻烦,因为它们涉及实例方法,这些方法既具有效果又返回值,这在f#中是一个危险信号。也就是说,虽然f#允许副作用,但它们在语言规范和惯例中都是被隔离的。期望返回unit
的方法有效果,但反过来,期望返回非单位值的方法是纯的。
此外,流畅的api试图解决c#等语言中f#没有或解决方式不同的限制。例如,在f#中,管道操作符+不可变数据结构转换相当于命令式语言中的流畅API。
尝试使用更惯用的f#单元测试断言库,例如Unquote(免责声明,我是作者)。它利用了f#的许多优点,就像fluentassertion试图弥补c#的缺点一样。
只需在函数末尾添加()
返回unit
在f#中,您可以尝试使用FsUnit
你不能在f#中返回void,感谢上帝!当在方法的末尾使用|> ignore
时,该方法返回unit
。在f#中
"系统。Void'只能用作
'typeof<System.Void>'