Почему мое предварительное условие игнорируется в моем тесте на основе свойств?

Почему мое предварительное условие игнорируется в моем тесте на основе свойств?

Предварительным условием для моего теста является следующее:

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)
Другие вопросы по тегам