2012-12-05 10 views
11

Ho problemi a eseguire i test utilizzando gocheck. Devo passare un flag per specificare quale test eseguire, ad es. .Flag di riga di comando in conflitto Golang

Il mio file di test importa un pacchetto di impostazioni, in cui esiste una funzione init() che specifica i propri flag e chiama flag.parseFlags(). Il problema che sto avendo è che sembra sovrascrivere i flag gocheck, quindi ricevo un errore che il flag -gocheck.f non è riconosciuto.

Nota: non è sicuro se ciò è rilevante, ma accade solo in alcuni dei miei pacchetti e non in altri. Presumo che sia solo in base all'ordine in cui decide di importare i pacchetti, ma ho pensato di parlarne nel caso in cui ciò fosse rilevante.

Qualcun altro si è imbattuto in questo problema? C'è un modo semplice per far sì che tutte le bandiere si uniscano senza essere sbalordite o che le bandiere del gocheck abbiano la precedenza sulle mie bandiere personalizzate?

risposta

14

Se più di un pacchetto chiama flag.Parse senza preoccupazioni riguardo ad altri pacchetti che definiscono altri flag, allora sei nei guai (come hai già sperimentato). Lo stato del pacchetto "flag" è uno stato globale, quindi è più o meno lo stesso come se diversi pacchetti sarebbero in competizione per impostare un valore di una variabile globale durante init su valori diversi. Questo potrebbe non finire bene, ovviamente.

Il modo più semplice per evitare ciò: flag.Parse deve essere chiamato solo una volta (nella prima approssimazione). Ecco perché è normalmente visto solo nel pacchetto "main". Se il pacchetto non principale chiama flag.Parse, in genere entrerà in conflitto con qualsiasi flag.Parse chiamato nel pacchetto "main". Si noti che go test sintetizza un package main per testare un pacchetto e flag.Parseè chiamato da quel pacchetto "principale" sintetizzato.

D'altra parte, è più "sicuro" (ma i conflitti sono possibili in ogni caso) per definire solamente le bandiere in un pacchetto non principale e si basano su flag.Parse sarebbe stato chiamato a pacchetto "principale". Nel pacchetto non principale, è possibile verificare che sia stato invocato flag.Parse utilizzando flag.Parsed().

Scritto sopra è semplificato. Per ulteriori opzioni, controllare il flag del pacchetto documentation. Più "potenza" potrebbe essere acquisita in alcuni scenari, ad esempio utilizzando flag.Flagset, ad esempio utilizzando lo stato locale per le opzioni flag all'interno di un pacchetto.

Tuttavia, personalmente preferisco non utilizzare il pacchetto "flag" all'esterno del pacchetto "main" in alcun modo e piuttosto impostare qualsiasi comportamento del pacchetto configurabile tramite la sua API. Esistono tuttavia delle eccezioni, ad es. in * _test file o altri casi speciali.

+2

Grazie. Ho effettivamente corretto il codice con tentativi ed errori importando gocheck in modo anonimo nel mio file delle impostazioni, e ora tutti i flag funzionano insieme. Dopo aver letto la tua risposta e aver esaminato la fonte del gocheck, capisco perché ha funzionato: gocheck non chiama mai flag.Parse(), quindi devo solo assicurarmi che gocheck venga importato prima che venga chiamato il metodo settings.init() e tutte le flag lavorare insieme. Un buon consiglio per quanto riguarda solo l'analisi delle bandiere in main, lo terrò a mente per il futuro. – danny

Problemi correlati