2017-03-10 7 views
0

FsCheck를보고 몇 가지 테스트를 작성하기 시작했습니다. 이제 더 복잡한 중재자를 구성하기위한 좋은 전략이 무엇인지 궁금합니다. 임의적으로 좋은 접근법에 등록한 중재자는 있습니까? 당신이 다른 관련 임의의 인스턴스가 같은 클래스에 추가하고 다른 인스턴스 간의 종속성이있는 경우 직접 대신 메서드를 호출 할 경우이이것은 중재자를 구성하는 좋은 전략입니까?

public class DiscountAmountArbitrator 
    { 
     public static Arbitrary<DiscountAmount> DiscountAmounts() 
     { 
      Arb.Register<AmountArbitrary>(); 

      var toReturn = (from a in Arb.Generate<Amount>() 
          select new DiscountAmount(a)) 
          .ToArbitrary(); 

      return toReturn; 
     } 
    } 

public class AmountArbitrary 
    { 
     public static Arbitrary<Amount> Amounts() 
     { 
      return Arb.Generate<decimal>().Where(x => x > 0) 
       .Select(x => new Amount(x)) 
       .ToArbitrary(); 
     } 
    } 
+0

'shrink'의 기본 구현을 사용하고 있기 때문에 발전기를 정의하고 하나를'DiscountAmounts '로 전달할 수도 있습니다. 그런 다음 '임의'인스턴스를 별도로 등록하십시오. – Lee

답변

0

내 조언 같은 뭔가가 될 것입니다. 그런 다음 임의의 임의의 인스턴스를 테스트에 사용하는 경우 즉시 등록하십시오.

이렇게하면 코드가 실행되는 순서에 덜 좌우됩니다 (Arb.Register는 근본적인 부작용이며 이로 인해 예기치 않은 결과가 발생할 수 있음). 다른 클래스에 임의의 메소드를 두는 것은 실제적인 이점이 없습니다. 그래서 당신이 가지고있는 것을 다음과 같이 다시 쓸 것입니다 :

public class Arbitraries 
{ 
    public static Arbitrary<DiscountAmount> DiscountAmounts() 
    { 
     var toReturn = (from a in Amounts().Generator 
         select new DiscountAmount(a)) 
         .ToArbitrary(); 

     return toReturn; 
    } 

    public static Arbitrary<Amount> Amounts() 
    { 
     return Arb.Generate<decimal>().Where(x => x > 0) 
      .Select(x => new Amount(x)) 
      .ToArbitrary(); 
    } 
} 
관련 문제