2016-12-07 37 views
1

매개 변수 (예 : string)를 받고 간단한 방법을 쓰는 간단한 방법을 작성해야합니다. 보통 두 가지 테스트가 끝납니다. 첫 번째 것은 guard clause입니다. 두 번째는 예상 동작을 확인할 것 (편의상, 방법은 실패 안) :FsCheck 속성 특성을 사용할 때 Null 값을 제외하는 방법은 무엇입니까?

[Fact] 
public void DoSmth_WithNull_Throws() 
{ 
    var sut = new Sut(); 
    Assert.Throws<ArgumentNullException>(() => 
     sut.DoSmth(null)); 
} 

[Fact] 
public void DoSmth_WithValidString_DoesNotThrow() 
{ 
    var s = "123"; 
    var sut = new Sut(); 
    sut.DoSmth(s); // does not throw 
} 

public class Sut 
{ 
    public void DoSmth(string s) 
    { 
     if (s == null) 
      throw new ArgumentNullException(); 

     // do smth important here 
    } 
} 

을 나는 수많은 다른 임의의 값이 전달됩니다 null 및 임의의 데이터를 생성하는 FsCheck[Property] 속성을 사용하려고 할 때 어떤 점에서 NRE을 유발 시험 :

[Property] 
public void DoSmth_WithValidString_DoesNotThrow(string s) 
{ 
    var sut = new Sut(); 
    sut.DoSmth(s); // throws ArgumentNullException after 'x' tests 
} 

나는이 확실히 대단한 다른 경우를 충당하기 위해 많은 임의의 데이터를 생성하는 FsCheck의 전체 아이디어는 것을 알고 있습니다.

[Property] 속성을 바람직하지 않은 값을 제외하도록 구성하는 우아한 방법이 있습니까? (이 테스트에서는 null입니다.)

답변

2

FsCheck에는 특정 동작을 신호하는 데 사용할 수있는 기본 제공 형식이 있습니다. 예를 들어 참조 형식 값은 null이 아니어야합니다. 이 중 하나는 NonNull<'a>입니다. 이들 중 하나를 요청하면 원시 문자열을 요청하는 대신 널 (null)을 얻지 않습니다.

F 번호에

, 당신은 함수 인수로 destructure 할 수있을 것입니다 :

[<Property>] 
let DoSmth_WithValidString_DoesNotThrow (NonNull s) = // s is already a string here... 
    let sut = Sut() 
    sut.DoSmth s // Use your favourite assertion library here... 
} 

내가 그는 C#으로, 그것은 다음과 같이 보일한다고 생각하지만, 나는 시도하지 않은 :

[Property] 
public void DoSmth_WithValidString_DoesNotThrow(NonNull<string> s) 
{ 
    var sut = new Sut(); 
    sut.DoSmth(s.Get); // throws ArgumentNullException after 'x' tests 
} 
+0

불행히도 C#에는 [NotNull] 속성이 없습니다 (적어도 소스 코드에서 찾을 수 없음). –

+0

@SergeyShushlyapin 그것은 속성이 아니며 유형입니다. 그것은 'FsCheck.Xunit'이 아니라'FsCheck'에 정의되어 있습니다. –

+0

아, 그건'No_n_Null'입니다! 나는 'No_t_Null'을 찾고있었습니다, 미안합니다, 미안 해요. 예, 작동합니다. 고마워요! –