单元测试 - 如何在 F# 中保持方法返回类型'void'?



我正在为我的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>'

最新更新