2011-09-14 17 views
5

Soy un novato en F # y estoy jugando con FParsec. Yo usaría FParsec para generar un AST. Me gustaría utilizar FsUnit para escribir algunas pruebas en las diversas partes del analizador para garantizar el funcionamiento correcto.Comparando Uniones Discriminadas

Tengo un problema con la sintaxis (lo siento, el código exacto está en funcionamiento, puedo publicar un ejemplo específico más adelante) entonces, ¿cómo podría uno comparar dos sindicatos discriminados (uno el esperado, el otro el resultado actual)? ¿Podría alguien proporcionar un pequeño ejemplo de código usando FsUnit (o NUnit), por favor?

Un ejemplo discriminado unión (muy simple)

type AST = 
    | Variable of string 
    | Class of string 
    | Number of int 
+3

(F # sindicatos tienen igualdad estructural, lo que significa que '=' hace la derecha cosa, comparando toda la estructura/valor.) – Brian

Respuesta

6

Dado que, como señaló Brian, F # sindicatos tienen igualdad estructural, esto es fácil utilizando cualquier marco de pruebas de unidad que es aficionado a.

FsUnit es una biblioteca específica de F # construida sobre NUnit. Mi biblioteca favorita de pruebas de unidades específicas de F # es Unquote,;), que es independiente del marco, y funciona muy bien con NUnit, xUnit.net, MbUnit, ... o incluso dentro de FSI. Puede estar interesado en la comparación this con FsUnit.

Entonces, ¿cómo harías esto con NUnit + Unquote? Aquí hay un ejemplo de trabajo completo:

module UnitTests 

open NUnit.Framework 
open Swensen.Unquote 

type AST = 
    | Variable of string 
    | Class of string 
    | Number of int 

let mockFParsec_parseVariable input = Variable(input) 

[<Test>] 
let ``test variable parse, passing example``() = 
    test <@ mockFParsec_parseVariable "x" = Variable("x") @> 

[<Test>] 
let ``test variable parse, failing example``() = 
    test <@ mockFParsec_parseVariable "y" = Variable("x") @> 

Luego de ejecutar las pruebas utilizando TestDriven.NET, la salida es la siguiente:

------ Test started: Assembly: xxx.exe ------ 

Test 'UnitTests.test variable parse, failing example' failed: 

UnitTests.mockFParsec_parseVariable "y" = Variable("x") 
Variable "y" = Variable("x") 
false 
    C:\xxx\UnitTests.fs(19,0): at UnitTests.test variable parse, failing example() 

1 passed, 1 failed, 0 skipped, took 0.80 seconds (NUnit 2.5.10). 
+0

Gracias, intentaré esto cuando empiece a trabajar. Creo que sé lo que estaba haciendo mal ahora después de ver tu ejemplo. Estaba usando (Variable "VAR"), pero debería haber estado usando Variable ("VAR") como esperaba ... marcaré como respondido con un poco de suerte. –

+0

Funcionó como un amuleto, gracias. Voy a dar una mirada dura a la cita, porque FsUnit no me está funcionando aquí ... –

+0

Unquote es genial, me encanta. Gracias –

2

Un ejemplo - si usted quiere comprobar el tipo, pero no el contenido

let matched x= 
    match x with 
    |Variable(_) -> true 
    | _ -> false 

señalar aquí que se necesita una función diferente para cada elemento de la unión discriminada

Si desea comparar la igualdad, puede hacerlo de la manera estándar, como

Assert.AreEqual(Variable("hello"),result) 

o

if result = Variable("hello") then stuff()