2016-10-06 2 views
3

테스트를 위해 두 개의 실제 매개 변수를 가져야하는 함수가 있습니다. 두 값은 임의적 인 인스턴스에 의해 만들어지며, 이는 완전히 자의적이지 않은 형식이어야합니다. 그들은 시험 방법의 서명과 일치하도록하는 2 개 임의의 인스턴스를
그래서 나는 다음과 같은 코드2 개의 임의 인스턴스를 결합하여 테스트 메소드 서명과 일치시키는 방법

let updating (x:SomeType) (y:SomeOtherType) = 
    let result = update x y 
    result.someProp = x.someProp 
    && result.otherProp = y.otherProp 

let arbSomeType = 
    Arb.generate<SomeType> 
     |> Gen.filter fun x -> x.checkSomeStuff 
     |> Arb.fromGen 

let arbSomeType = 
    Arb.generate<SomeOtherType> 
     |> Gen.filter fun x -> x.checkPropertiesOfThis 
     |> Arb.fromGen 

를 작성하지만 어떻게 지금 결합합니까?

//let prop = Prop.forAll arbSomeType + arbSomeType updating 

Check.QuickThrowOnFailure prop 

답변

6

두 가지 유형, SomeTypeASomeTypeB 감안할 때 :

type SomeTypeA = 
    { A : obj } 

type SomeTypeB = 
    { B : obj } 

당신은과 같이, 입력은 두 종류이다하는 Property를 만들 수 있습니다

let prop = 
    gen { let! a = Arb.generate<SomeTypeA> 
      let! b = Arb.generate<SomeTypeB> 
      return a, b } 
    |> Arb.fromGen 
    |> Prop.forAll 
    <| fun (a, b) -> 
     // 'a' is SomeTypeA 
     // 'b' is SomeTypeB 
     true // Dummy - replace with whatever you want to do with 'a' and 'b'. 

을 또한 필요 테스트 방법의 서명이 생성 된 임의의 값을 반영하므로 쌍에 대해 (단발적인) 함수가되도록주의하십시오. 예 원리

// instead of 
let updating (x:SomeType) (y:SomeOtherType) = ... 
// do this 
let updating (x:SomeType, y:SomeOtherType) = ... 

:

  • gen 연산 식, Arbitrary<SomeTypeA * SomeTypeB> 인스턴스
  • 마침내 생성 부에서 생성되는 유형 Gen<SomeTypeA * SomeTypeB>
  • 의 발전기를 만드는 (빠른 검사/FsCheck) 속성은 임의의 vi Prop.forAll

그것은 항상 같은 경로입니다 : 도움이

Generator[/optional Shrinker] -> Arbitrary -> Property -> <your_code> 

희망.

관련 문제