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

aba*_*hev 8 f# unit-testing void vs-unit-testing-framework fluent-assertions

我正在使用F#,Visual Studio单元测试框架(又名MSTest)和FluentAssertions为我的F#库编写单元测试.

测试方法应该具有void或Task的返回类型.在C#中这很容易:

[TestMethod]
public void TestMethod1()
{
    false.Should().BeFalse();
}
Run Code Online (Sandbox Code Playgroud)

在F#我有以下内容:

[<TestMethod>]
member this.TestMethod1() =
    false.Should().BeFalse(null)
    |> ignore
Run Code Online (Sandbox Code Playgroud)

否则返回类型更改为,FluentAssertions.PrimitivesBooleanAssertions因此Test Runner看不到它.

如何避免|> ignore每次测试结束?

Ste*_*sen 13

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

"Fluent"API在F#中是一种麻烦,因为它们涉及实例方法,它们都具有效果并返回值,F#中的红色标记.也就是说,虽然在F#中允许副作用,但它们在语言规范和惯例中都有所隔离.期望返回的方法unit具有效果,但相反地,返回非单位值的方法预期是纯的.

此外,流畅的API寻求解决F#语言中的限制,例如F#没有或解决不同的语言.例如,在F#中,管道操作符+不可变数据结构转换与命令式语言中的流畅API相当.

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


Joh*_*mer 7

只需()在函数末尾添加

这将返回单位

  • 然后我收到一个警告:`这个表达式应该有类型'unit',但有类型'AndConstraint&lt;Primitives.PrimitivesBooleanAssertions&gt;'。使用 'ignore' 丢弃表达式的结果,或使用 'let' 将结果绑定到名称。` (2认同)