2016-10-14 10 views
2

xUnit 및 FsCheck를 사용하여 F #에서 작성된 테스트를 사용하여 C#에서 다이아몬드 카타를 수행하고 있으며 확인하려고 할 때 약간의 문제가 있습니다. 유저가 무효 인 입력 (임의의 발음 구별없이 알파벳 문자가 아닌 임의의 문자)의 경우에 예외가 Throw되는 경우 테스트중인FU에서 xUnit 및 FsCheck가있는 메소드로 예외가 던져 졌는지 확인하는 방법

방법을 : 다음은 코드가 지금과 같은 방법

public static string Make(char letter) 
{ 
    if (!Regex.IsMatch(letter.ToString(), @"[a-zA-Z]")) 
    { 
     throw new InvalidOperationException(); 
    } 

    // code that makes the diamond 
} 

테스트 :

[<Property>] 
let ``Diamond.Make must throw an InvalidOperationException if a character that isn't 
     an alphabet letter without any diacritics is given`` (letter : char) = 
    (not (('A' <= letter && letter <= 'Z') || ('a' <= letter && letter <= 'z'))) ==> lazy 
     (Assert.Throws<InvalidOperationException>(fun() -> Diamond.Make letter |> ignore)) 

내 접근 방식의 문제는 테스트가 예외가 슬로우되지 않는 것을 말한다이다, 하지만 테스트 스위트에 표시된 입력으로 애플리케이션을 실행할 때 예외가 발생합니다. 여기

는 테스트 스위트에 의해 주어진 메시지입니다 (I 의도적으로 테스트 이름 및 스택 추적을 생략 한) : 테스트 스위트는 값 ')'에 대한 예외가 발생되지 않고 있다고하지만

Test Outcome: Failed 
Test Duration: 0:00:00,066 
Result Message: 
FsCheck.Xunit.PropertyFailedException : 
Falsifiable, after 1 test (0 shrinks) (StdGen (1154779780,296216747)): 
Original: 
')' 
---- Assert.Throws() Failure 
Expected: typeof(System.InvalidOperationException) 
Actual: (No exception was thrown) 

을, 내가 그랬어 수동 테스트와 예상 예외가 실제로 발생했습니다.

예외가 테스트에 의해 포착 된 것을 어떻게 확인할 수 있습니까?

+3

받고있는 전체 테스트 실패 메시지를 게시하십시오. 또한 스크롤이 필요하지 않도록 코드를 포맷하십시오. –

+3

FsCheck는 그 속성을 위조하기 쉽다고 생각합니다. 여기에 주어진 범위를 벗어나는 많은 'char'값이 있습니다. 'ü'와'ø'. 이들은 'Char.IsLetter'에 따른 편지입니다. –

+1

지금 Char.IsLetter를 테스트하고 있다는 것을 알고 있습니까? –

답변

4

제가 생각하기에 문제가 발생하면 Assert.Throws가 주어진 유형의 예외를 반환한다는 것입니다. Assert.Throws의 반환 값을 무시하면 도움이 될 것입니다.

let test (letter : char) = 
    (not (('A' <= letter && letter <= 'Z') || ('a' <= letter && letter <= 'z'))) ==> 

    lazy 
     Assert.Throws<InvalidOperationException>(fun() -> Diamond.Make letter |> ignore) 
     |> ignore 
+0

속성에는 부울 값을 반환하지 않습니다. 'unit' 또는'Property'를 반환 할 수도 있습니다. 'unit'을 반환하기 위해서는'Assert.Throws'의 결과를'ignore'로 파이핑해서는 안됩니다. –

+0

@ MarkSeeman 당신 말이 맞아요. 나는 대답을 편집 할 것이다. –

+0

이렇게하면 효과가 있습니다. 감사! –