如何保持方法返回类型' void'在F#?

时间:2014-03-12 23:11:56

标签: unit-testing f# void vs-unit-testing-framework fluent-assertions

我使用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

3 个答案:

答案 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>'