1

我正在尝试使用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基本相同的结果。

关于为什么先决条件在此示例中不起作用的任何想法?

4

0 回答 0