2011-12-13 7 views
5

Quiero agregar una prueba a mi distribución de Perl que requiera un módulo Foo, pero mi distribución no requiere Foo; solo la prueba requiere Foo. Así que no quiero agregar el módulo a las dependencias, pero en cambio solo quiero omitir las pruebas que requieren Foo si Foo no está disponible en tiempo de compilación.¿Cómo puedo ejecutar una prueba en el conjunto de pruebas de mi módulo Perl solo si está instalado el módulo requerido?

¿Cuál es la forma correcta de hacerlo? ¿Debo simplemente envolver mis pruebas Foo en un bloque eval junto con use Foo;, para que las pruebas no se ejecuten si la carga de Foo falla? ¿O hay una forma más elegante de hacerlo?

+0

¿Qué módulo de prueba está utilizando? – Pradeep

+0

Estoy usando Test :: More, pero no dude en sugerirme otro si tiene esta característica. –

+0

Mire las respuestas a continuación, pero leyendo la buena documentación anterior del módulo que está utilizando debe ser la primera opción :-) – Matteo

Respuesta

6

Test :: Más tiene una opción para saltar si alguna condición no se cumple, véase más adelante

SKIP: { 
    eval { require Foo }; 

    skip "Foo not installed", 2 if [email protected]; 

    ## do something if Foo is installed 
}; 
+0

Agradable y simple. Ahora que sé sobre la función "omitir" en Test :: More, encontré la sección al respecto en los documentos. ¡Gracias! –

+0

De nada :-) – Pradeep

+2

'eval {require Foo} u omite ...;' –

8

Si todas las pruebas que requieren Some::Module se encuentran en un solo archivo, es fácil de hacer:

use Test::More; 

BEGIN { 
    eval { 
     require Some::Module; 
     1; 
    } or do { 
     plan skip_all => "Some::Module is not available"; 
    }; 
} 

(Si está utilizando una cuenta de prueba como use Test::More tests => 42; entonces necesita también arreglar hacer si el plan tests => 42; requieren qué tienen éxito.)

Si son un menor número de pruebas en un archivo que contiene otras cosas, entonces se podría hacer algo como:

our $HAVE_SOME_MODULE = 0; 

BEGIN { 
    eval { 
     require Some::Module; 
     $HAVE_SOME_MODULE = 1; 
    }; 
} 

# ... some other tests here 

SKIP: { 
    skip "Some::Module is not available", $num_skipped unless $HAVE_SOME_MODULE; 
    # ... tests using Some::Module here 
} 
2

De la documentación de Test::More:

SKIP: { 
    eval { require HTML::Lint }; 
    skip "HTML::Lint not installed", 2 if [email protected]; 
    my $lint = new HTML::Lint; 
    isa_ok($lint, "HTML::Lint"); 
    $lint->parse($html); 
    is($lint->errors, 0, "No errors found in HTML"); 
} 
2

Además, declare your test step requirement or recommendation (hay una diferencia) en el archivo meta de distro. Esto será recogido por un cliente que realice la instalación. En el momento de la instalación, el usuario puede decidir si instalar dicho requisito de forma permanente o descartarlo, ya que solo se utilizó para las pruebas.

+0

Parece que el enfoque 'Test :: More :: skip' y su respuesta son complementarios. La función 'skip' me permite omitir las pruebas que requieren un módulo que no está disponible, mientras que su respuesta me permite recomendar que el cliente instale el módulo sin que sea una dependencia difícil. Si el cliente que está instalando mi dist decide no instalar la dependencia de prueba opcional, ¿omitirá * todas * las pruebas? ¿O sabrá de alguna manera qué pruebas dependen de ese módulo opcional y omitirá automáticamente solo esas? –

+0

O, para decirlo de manera más simple, declarar una dependencia opcional definitivamente es algo que haré, pero no veo cómo me libera de la obligación de manejar el caso donde ese módulo opcional no está instalado. –

+0

No del todo, si es un requisito de prueba, * estará * disponible. Pero ahora me doy cuenta de que de eso no se trata la pregunta, malinterpreté lo que querías decir con opcional. Tiene razón en que el chequeo de omisión es necesario en ese caso; Edité la respuesta para que sea así. – daxim

Cuestiones relacionadas