6

我正在使用F#,Visual Studio單元測試框架(又名MSTest)和FluentAssertions爲我的F#庫編寫單元測試。如何在F#中保留方法返回類型'void'?

測試方法應該有返回類型void或Task。在C#中,很容易:

[TestMethod] 
public void TestMethod1() 
{ 
    false.Should().BeFalse(); 
} 

在F#我有以下幾點:

[<TestMethod>] 
member this.TestMethod1() = 
    false.Should().BeFalse(null) 
    |> ignore 

否則返回類型更改爲FluentAssertions.PrimitivesBooleanAssertions所以測試運行並不這麼看。

如何避免每次測試結束時都有|> ignore

回答

12

|> ignore需要在這裏,由於TestMethod1的簽名是從「裏外」推斷出來的。考慮在C#中,方法聲明中需要方法的返回類型。這些是語言之間的深刻差異。

「Fluent」API在F#中是令人討厭的,因爲它們涉及實例方法,它們都具有效果並返回一個值,即F#中的紅旗。也就是說,雖然F#允許使用副作用,但在語言規範和慣例中,它們都有些隔離。預計返回unit的方法會產生影響,但相反,返回非單位值的方法預計會是純粹的。此外,流暢的API尋求解決F#不具備或解決方式不同的語言(如C#)的限制。例如,在F#中,管道操作符+不可變數據結構轉換可以與命令式語言中的流暢API相媲美。

嘗試使用更慣用的F#單元測試斷言庫,如Unquote(免責聲明,我是作者)。它利用F#的許多優點,就像FluentAssertions試圖彌補C#的弱點一樣。

+0

謝謝!尤其是對於詳細的答案我會很快嘗試你的lib。 – abatishchev

+0

btw爲什麼你使用谷歌代碼而不是Github或Codeplex?這兩個看起來更好的開源代碼託管服務給我。 – abatishchev

+0

@abatishchev only Google Code支持Mercurial和Subversion(SvnBridge不算),我的分佈式和集中式VCS是首選。除了這個showstopper之外,我一直喜歡Google Code的簡單而強大的用戶界面。話雖如此,我對Google Code最近停止二進制託管以及普遍缺乏進一步發展感到困擾。 –

1

在F#中,你可以嘗試,而不是FsUnit

在F#,感謝神不能返回void!當您在方法的末尾使用|> ignore時,該方法返回unit。在F#,

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

4

就在你的函數的末尾添加()

這將返回單元

+2

然後我得到一個警告:'這個表達式應該有'unit'類型,但是類型爲'AndConstraint '。使用'忽略'放棄表達式的結果,或'讓'將結果綁定到名稱上。' – abatishchev

相關問題