Pergunta

Eu tenho profundamente aninhados datastructure com carros alegóricos em todo o lugar.Eu estou usando FsCheck para verificar se a data é alterada após a serialização e desserialização.

Esta falha de propriedade, quando uma válvula é um NaN ou +/- infinito, no entanto, caso não me interessa, desde que eu não esperava esses valores para ocorrer nos dados reais.

Existe uma maneira de impedir que FsCheck de geração de NaN e infinitos?

Eu tentei descartar gerado dados que contém disse: valores, mas isto torna o teste muito lento, tão lento, na verdade, que o teste ainda está em execução enquanto eu estou escrevendo isso, e eu tenho minhas dúvidas se ele vai realmente acabar...

Foi útil?

Solução

Para reflexivo gerado tipos que contêm flutua (como eu suspeitar que você está usando) você pode substituir o padrão do gerador para flutua escrevendo uma classe da seguinte maneira:

type Overrides() =
    static member Float() =
        Arb.Default.Float()
        |> filter (fun f -> not <| System.Double.IsNaN(f) &&
                            not <| System.Double.IsInfinity(f)) 

E, em seguida, chamar:

Arb.register<Overrides>()

Antes de FsCheck tenta gerar os tipos;exemplo:em sua configuração de ensaio ou antes de chamar de Seleção.Rápido.

Você pode conferir o resultado do método de registro para ver como ele fundiu o padrão arbitrário instâncias com as novas;ele deverá assumi-los.

Se você estiver usando o xUnit extensão você pode evitar chamar a Arb.registrar usando o Arbitraries argumento de PropertyAttribute:

[<Property(Arbitraries=Overides)>]

Outras dicas

Mauricio Scheffer disse, você pode usar NormalFloat tipo de parâmetro de teste.

Exemplo simples para a lista de carros alegóricos:

open FsCheck

let f (x : float list) = x |> List.map id

let propFloat (x : float list) = x = (f x)

let propNormalFloat (xn : NormalFloat list) = 
    let x = xn |> List.map NormalFloat.get
    x = f x

Check.Quick propFloat
//Falsifiable, after 18 tests (13 shrinks) (StdGen (761688149,295892075)):
//[nan]

Check.Quick propNormalFloat
//Ok, passed 100 tests.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top