2017-10-20 48 views
2

在C#中,我可以聲明未初始化的變量,然後在該類的各種方法中分配該變量。例如,在NUnit測試中,我可以聲明一個類型化變量,它只能在安裝程序中初始化,然後在各種測試中重複使用。什麼是習慣性的F#相當於聲明一個變量以供將來在C#中使用

private MyTestClass sut; 

public Setup() 
{ 
    sut = new MyTestClass(); 
    etc. 
} 

public FirstTest() 
{ 
    sut.DoSomeWork(1); 
} 

public SecondTest() 
{ 
    sut.DoSomeWork(2); 
} 

我想在F#中做同樣的事情。然而根據this和其他人的說法,未分配的'變量'並不是F#中完成的事情。

在我的F#測試的情況下,測試不坐在任何類型,只是在一個模塊內,所以[<DefaultValue>] val將無法​​正常工作。 使用mutable只是覺得不對,因爲這似乎是F#編碼器最後選擇的選項。

由於idomatic F#不應該要求未賦值,因此解決此問題的「正確」方法是什麼?

+0

'let sut = new MyTestClass()'有什麼問題? – s952163

+0

爲什麼你需要這些變量?你有什麼理由不能在你使用它們的地方申報?在你的C#示例中,這兩個測試不能並行執行,你在腳下自己拍攝。 –

+0

當然,我不應該在每次使用它的地方都聲明變量。如果每個測試需要一個相同初始化的類的實例,那麼該初始化應該在設置中。如果您有大量測試,並且每個測試需要對各種幫助類進行復雜初始化,您會做什麼?你不想在每次測試中都這樣做。你會堅持在每個測試初始化​​之前運行的助手,即安裝方法。我誤解了什麼? – FSharpOrBust

回答

5

您可以使用函數和值。沒有必要聲明未分配的變量。

let makeTestClass() = 
    MyTestClass() 
    // etc. 

let ``First test``() = 
    let sut = makeTestClass() 
    sut.DoSomeWork() 

let ``Second test``() = 
    let sut = makeTestClass() 
    sut.DoSomeWork() 
+0

我不明白這是如何適應與安裝方法的上下文?這樣做是爲了調用返回測試類的方法,在每個測試中聲明和初始化(如上面的Fyodor所建議的)。如果這是在F#中做事情的標準方式,那麼我會去做這件事,但我不禁想到我在這裏錯過了一招。 – FSharpOrBust

+0

我在說不要使用安裝方法。這是慣用的F#。這很簡單,它允許測試並行運行。 – TheQuickBrownFox

1

你可以使用lazy

let sut = lazy (new MyTestClass()) 

lazy直到需要的結果推遲表達式的執行。隨後對延遲值的請求不需要重新計算,它只是返回上次存儲的結果。

然後,你可以這樣做:

let ``First test``() = 
    sut.Force().DoSomeWork(1) 

let ``Second test``() = 
    sut.Force().DoSomeWork(2) 

如果初始化是昂貴的,你不希望重複這可能是合適的。

相關問題