2011-12-13 11 views
5

Voglio aggiungere un test alla mia distribuzione Perl che richiede un modulo Foo, ma la mia distribuzione non richiede Foo; solo il test richiede Foo. Quindi non voglio aggiungere il modulo alle dipendenze, ma preferisco semplicemente saltare i test che richiedono Foo se Foo non è disponibile al momento della compilazione.Come posso eseguire un test nella suite di test del mio modulo Perl solo se è installato il modulo richiesto?

Qual è il modo corretto per farlo? Devo semplicemente avvolgere i miei Foo test in un blocco eval insieme a use Foo;, in modo che i test non vengano eseguiti se il caricamento di Foo fallisce? O c'è un modo più elegante di farlo?

+0

Quale modulo di test stai usando? – Pradeep

+0

Sto usando Test :: Altro, ma sentiti libero di suggerirne un altro se ha questa funzione. –

+0

Guarda le risposte di seguito ma leggere la vecchia buona documentazione del modulo che stai usando dovrebbe essere la prima opzione :-) – Matteo

risposta

6

Test :: More ha la possibilità di saltare se qualche condizione non è soddisfatta, vedi sotto

SKIP: { 
    eval { require Foo }; 

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

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

Bello e semplice. Ora che conosco la funzione "salta" in Test :: Altro, ho trovato la sezione su di esso nei documenti. Grazie! –

+0

Prego :-) – Pradeep

+2

'eval {require Foo} o skip ...;' –

8

Se tutti i test che richiedono Some::Module sono in un unico file, è facile da fare:

use Test::More; 

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

(Se stai usando un conteggio test come use Test::More tests => 42; allora avete bisogno di organizzare anche a che fare plan tests => 42; se la richiedono fa avere successo.)

Se sono un numero minore di test in un file che contiene altre cose, allora si potrebbe fare qualcosa di simile:

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

Dalla documentazione di 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

Inoltre, declare your test step requirement or recommendation (c'è una differenza) nel meta file della distro. Questo verrà raccolto da un client che esegue l'installazione. Al momento dell'installazione, l'utente può decidere se installare tale requisito in modo permanente o scartarlo perché è stato utilizzato solo per il test.

+0

Sembra l'approccio 'Test :: More :: skip' e la tua risposta è complementare. La funzione 'skip' mi permette di saltare i test che richiedono un modulo che non è disponibile, mentre la tua risposta mi consente di consigliare al client di installare il modulo senza renderlo una dipendenza difficile. Se il client che installa il mio dist decide di non installare la dipendenza di test opzionale, salterà * tutti * i test? O in qualche modo saprà quali test dipendono da quel modulo opzionale e salteranno automaticamente solo quelli? –

+0

O, per dirla in parole povere, dichiarare una dipendenza opzionale è sicuramente qualcosa che farò, ma non vedo come mi liberi dall'obbligo di gestire il caso in cui quel modulo opzionale non è installato. –

+0

Non proprio, se si tratta di un requisito di prova, sarà * disponibile *. Ma ora mi rendo conto che non è quello di cui si tratta, ho interpretato male ciò che intendevi con facoltativo. Hai ragione che il controllo skip è necessario in tal caso; Ho modificato la risposta per renderlo tale. – daxim

Problemi correlati