2017-10-20 54 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) 

如果初始化是昂贵的,你不希望重复这可能是合适的。

相关问题