我正在尝试使用FsCheck
图书馆。我可以做一些测试,但前提条件似乎不起作用。下面的代码提供了一个示例:
let sortEven (xs: int list) =
xs
|> List.filter (fun x -> x % 2 = 0)
|> List.sort
let lengthGT0 (xs: int list) = (List.length xs) > 0
[<Property>]
let checkSortEven (xs: int list) =
lengthGT0 xs ==>
((xs |> sortEven |> List.sum) = (xs |> List.rev |> sortEven |> List.max))
使用空列表作为参数调用该函数会checkSortEven
产生异常,因为List.rev
同样如此。因此,在上面的代码中,我尝试使用前置条件,使用==>
运算符来防止 FsCheck 尝试空列表。但是,无论是测试的第一个列表为空还是收缩列表为空checkSortEven
,都称为产生异常:
Falsifiable, after 1 test (0 shrinks) (StdGen (843297067,296354622)):
Original:
[]
with exception:
System.ArgumentException: The input sequence was empty.
Falsifiable, after 1 test (1 shrink) (StdGen (1296284131,296354622)):
Original:
[-1]
Shrunk:
[]
with exception:
System.ArgumentException: The input sequence was empty.
Falsifiable, after 1 test (2 shrinks) (StdGen (1865393009,296354622)):
Original:
[-1; 1]
Shrunk:
[]
with exception:
System.ArgumentException: The input sequence was empty.
为什么在我的基于属性的测试中忽略了我的先决条件?但这似乎是另一种情况(嵌套函数)。
我也尝试过Check.QuickThrowOnFailure
,而不是Check.Quick
基本相同的结果。
关于为什么先决条件在此示例中不起作用的任何想法?