2017-10-20 5 views
2

C#에서는 초기화되지 않은 변수를 선언 할 수 있습니다.이 변수는 나중에 클래스의 다양한 메서드에서 할당됩니다. 예를 들어, NUnit 테스트에서 나는 setup 메소드에서만 초기화 된 다음, 다양한 테스트에서 반복적으로 사용되는 타입 변수를 선언 할 수 있습니다.나중에 C#에서 사용하기 위해 변수를 선언하는 것과 동일한 관용적 인 F #은 무엇입니까

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는 식의 실행을 지연시킵니다. Lazy 값에 대한 후속 요청은 다시 계산할 필요가 없으며 마지막으로 저장된 결과 만 반환합니다.

은 그럼 당신은 할 수 있습니다 : 초기화가 비싼 당신이 그것을 반복하지 않으려면

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

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

이 적합 할 수있다.