9

我正在使用 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在每次测试结束时出现?

4

3 回答 3

15

|> ignore这里是必需的,因为签名TestMethod1是从“由内而外”推断出来的。考虑到在 C# 中,方法声明中需要方法的返回类型。这些是语言之间的深刻差异。

“Fluent” API 在 F# 中是个麻烦事,因为它们涉及的实例方法既具有效果又返回值,这在 F# 中是一个危险信号。也就是说,虽然在 F# 中允许使用副作用,但在语言规范和约定中它们都被隔离了。期望返回的方法unit具有效果,但相反,期望返回非单位值的方法是纯的。

此外,流畅的 API 寻求解决诸如 C# 之类的语言中 F# 没有或解决方式不同的限制。例如,在 F# 中,管道运算符 + 不可变数据结构转换可与命令式语言中的流畅 API 相媲美。

尝试使用更惯用的 F# 单元测试断言库,例如Unquote(免责声明,我是作者)。它利用了 F# 的许多优点,就像 FluentAssertions 试图弥补 C# 的弱点一样。

于 2014-03-13T01:25:24.390 回答
8

只需()在函数末尾添加

这将返回单位

于 2014-03-13T00:48:57.910 回答
2

在 F# 中,您可以尝试改为FsUnit

你不能在 F# 中返回 void,感谢上帝!当您|> ignore在方法的末尾使用时,该方法返回unit. 在 F# 中,

'System.Void' 只能用作'typeof<System.Void>'

于 2014-03-12T23:38:34.703 回答