我使用F#,Visual Studio单元测试框架(又名MSTest)和FluentAssertions为我的F#库编写单元测试。
测试方法的返回类型应为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
?
答案 0 :(得分:13)
|> ignore
,因为TestMethod1
的签名是从内部输出&#34;内部输出&#34;。考虑在C#中,方法声明中需要方法的返回类型。这些是语言之间的深刻差异。
&#34;良好&#34; API在F#中是一种麻烦,因为它们涉及具有效果并返回值的实例方法,F#中的红色标记。也就是说,虽然在F#中允许副作用,但它们在语言规范和惯例中都有所隔离。预计返回unit
的方法会产生影响,但相反,返回非单位值的方法应该是纯粹的。
此外,流畅的API寻求解决F#语言中的限制,而F#没有或以不同的方式解决。例如,在F#中,管道操作符+不可变数据结构转换与命令式语言中的流畅API相当。
尝试使用更加惯用的F#单元测试断言库,例如Unquote(免责声明,我是作者)。它充分利用了F#的许多优点,就像FluentAssertions试图弥补C#的弱点一样。
答案 1 :(得分:4)
只需在功能结束时添加()
这将返回单位
答案 2 :(得分:2)
在F#中,您可以尝试FsUnit
你不能在F#中归还虚空,感谢上帝!在方法结束时使用|> ignore
时,该方法将返回unit
。在F#中,
'System.Void'只能用作
'typeof<System.Void>'