Почему мое предварительное условие игнорируется в моем тесте на основе свойств?
Почему мое предварительное условие игнорируется в моем тесте на основе свойств?
Предварительным условием для моего теста является следующее:
fun rowCount -> rowCount >= 0
Таким образом, мой настоящий тест:
[<Fact>]
let ``number of cells in grid equals rowcount squared`` () =
Check.QuickThrowOnFailure <|
fun rowCount -> rowCount >= 0 ==>
fun rowCount -> rowCount |> createGrid
|> Map.toList
|> List.length = rowCount * rowCount
Тем не менее, мой тест по-прежнему не проходит:
Сообщение о результате: System.Exception: Falsifiable, после 3 тестов (1 сжатие) (StdGen (985619705,296133555)): Оригинал: 1 -1 Сокращение: 0 -1
Домен:
let createGrid rowCount =
[for x in 0..rowCount-1 do
for y in 0..rowCount-1 do
yield { X=x; Y=y; State=Dead }
]|> List.map (fun c -> (c.X, c.Y), { X=c.X; Y=c.Y; State=Dead })
|> Map.ofList
[ОБНОВИТЬ]
Я также попробовал:
let precondition rowCount =
rowCount >= 0
let ``some property`` rowCount =
precondition rowCount ==> rowCount |> createGrid
|> Map.toList
|> List.length = rowCount * rowCount
[<Fact>]
let ``number of cells in grid equals rowcount squared`` () =
Check.QuickThrowOnFailure <| ``some property``
Однако я получаю следующую ошибку:
Несоответствие типов. Ожидается свойство -> 'a, но с заданным значением int -> Map<(int * int), Cell> Тип'Property'не соответствует типу' int '
1 ответ
Как отмечает @FyodorSoikin в своем комментарии, у вас есть две вложенные функции, каждая из которых принимает rowCount
,
Второй rowCount
значение тени первого, но ==>
функция предусловия работает только на первом rowCount
значение. Таким образом rowCount
значение, фактически используемое для тестирования, все еще не ограничено.
Сделайте тест проще, и он будет работать:
open Xunit
open FsCheck
[<Fact>]
let ``number of cells in grid equals rowcount squared`` () =
Check.QuickThrowOnFailure <| fun rowCount ->
rowCount >= 0 ==>
(rowCount
|> createGrid
|> Map.toList
|> List.length = rowCount * rowCount)