2017-10-19 7 views
3

FsCheck에는 테스트 데이터를 생성하기위한 몇 가지 기본 유형이 있습니다 (Arbitrary). 그러나 나의 시험 날짜 중 하나가 다른 것에 달려 있다면 어떨까요?FsCheck : 다른 테스트 데이터에 의존하는 테스트 데이터를 생성하는 방법은 무엇입니까?

는 예를 들어, 결과 문자열이 이상 입력 문자열보다 수 없다 string.Substring()의 특성을 고려 :

[Fact] 
public void SubstringIsNeverLongerThanInputString() 
{ 
    Prop.ForAll(
     Arb.Default.NonEmptyString(), 
     Arb.Default.PositiveInt(), 
     (input, length) => input.Get.Substring(0, length.Get).Length <= input.Get.Length 
    ).QuickCheckThrowOnFailure(); 
} 

Substring의 구현은 확실히 올바른하지만를,이 속성으로 인해 결국 PositiveInt 것이다 실패 이 예외는 genereated NonEmptyString보다 길어 예외가 발생합니다.

Shrink : NonEmptyString "a"예외가있는 PositiveInt 2 : System.ArgumentOutOfRangeException : 인덱스와 길이는 문자열 내의 위치를 ​​참조해야합니다.

나는 if (input.Length < length) return true;과 비교할 수 있었지만 그 방법은 테스트를 많이 마쳤습니다. 속성은 확인조차하지 않았습니다.

입력 문자열을 초과하지 않는 PositiveInt 만 생성하도록하려면 어떻게해야합니까? 나는 내가 Gen<T> 클래스를 사용할 필요가 추정하지만 인터페이스는 나에게 혼란 만 화끈하다의 ... 나는 시도 다음하지만 여전히 PositiveInt의 문자열 초과 가지고 :

var inputs = Arb.Default.NonEmptyString(); 
// I have no idea what I'm doing here... 
var lengths = inputs.Generator.Select(s => s.Get.Length).ToArbitrary(); 

Prop.ForAll(
    inputs, 
    lengths, 
    (input, length) => input.Get.Substring(0, length).Length <= input.Get.Length 
).QuickCheckThrowOnFailure(); 
+0

는 https://fscheck.github.io/FsCheck/TestData.html – MethodMan

+0

나는 여러 번 이미이 사이트를 통해 보면서 아직도 내가 원하는 것을 할 수있는 방법을 알아낼 수 없었다. –

답변

4

당신은 값에 따라 발전기를 만들 수 있습니다 SelectMany을 사용하여 다른 것으로부터 생성됩니다. 예를 들어 LINQ 쿼리 구문을 사용할 수도 있습니다.

var gen = from s in Arb.Generate<NonEmptyString>() 
      from i in Gen.Choose(0, s.Get.Length - 1) 
      select Tuple.Create(s, i); 

var p = Prop.ForAll(Arb.From(gen), t => 
{ 
    var s = t.Item1.Get; 
    var len = t.Item2; 
    return s.Substring(0, len).Length <= s.Length; 
}); 

Check.Quick(p); 
+0

[공식 문서] (https://fscheck.github.io/FsCheck/TestData.html)에서 찾을 수있는 것입니까? 그렇지 않다면 참조를 추가 할 수 있습니까? –

+2

@ GoodNightNerdPride - 나는 C# interop에 대한 많은 문서를 보지 못했기 때문에, 나는'gen' 빌더에서 소스와 교육 된 추측을 기반으로 알아 냈을 것입니다. F #의 계산식 ('gen {...} '과 같은)은 C# LINQ 쿼리 구문과 매우 유사하게 매핑됩니다 (F #이 더 많은 기능을 지원하지만). – Lee

+1

F # 계산 식 또는 LINQ 구문에 대한 문서에는 많은 예제가 없습니다. 다음은 TestData 페이지의 두 번째 단락에 https://github.com/fscheck/FsCheck/blob/master/examples/FsCheck.CSharpExamples/Program.cs#L150 LINQ가 나와있는 예제입니다. 여기에 작은 예제가 있습니다. https://fscheck.github.io/FsCheck/TestData.html#Generators –

관련 문제