2013-06-06 10 views
15

Ho un'applicazione console C#. Una delle sue funzioni sta leggendo il valore appconfig e fa un po 'di lavoro.Impossibile leggere le app dell'app durante il test dell'unità

string host = ConfigurationManager.AppSettings["Host"] 

Così ho scritto il test NUNIT per la mia applicazione console. Il progetto di test delle unità è stato creato utilizzando la libreria di classi.

Ma il mio test di unità non funziona ora. Perché non sta leggendo le impostazioni della mia app (indica nessuna impostazione dell'app). Qual è la ragione per questo.
Quando eseguo la mia app console, sta leggendo le impostazioni dell'app correttamente.

risposta

29

Si dovrebbe avere un app.config creato per il progetto di test dell'unità. L'app.config della tua applicazione per console non verrà consultata quando esegui i test unitari.

+3

Questo significa che ho da aggiungere in seguito al mio progetto di test pure. ' ' –

+0

Sì hai ragione – aquaraga

+0

Ha funzionato. Non lo sapevo mai. Grazie per l'aiuto –

11

Mentre è possibile definire le impostazioni dell'app in un altro file di configurazione per il progetto di test dell'unità, il test dell'unità alle interfacce mediante l'iniezione delle dipendenze può aiutare a suddividere le aree che i test delle unità copriranno in porzioni più gestibili.

Così si potrebbe avere la vostra interfaccia di configurazione come:

public interface IConfiguration 
{ 
    public string Host { get; set; } 
} 

tua classe per testare avrebbe accettato una classe IConfiguration come parametro (di solito per il vostro costruttore) in questo modo:

public class MyClass 
{ 
    IConfiguration _config; 
    public MyClass(IConfiguration config) 
    { 
     _config = config; 
    } 

    public void MyMethodToTest() 
    { 
    } 
} 

Allora la vostra test può utilizzare l'interfaccia per passare la configurazione anziché dipendere da un file di configurazione esterno che può potenzialmente modificare e influire sul test dell'unità:

[Test] 
public void Testing_MyMethodToTest() 
{ 
    // arrange 
    var config = new Configuration { Host = "My Test Host" }; 
    // act 
    new MyClass(config).MyMethodToTest(); 
    // Add assertion for unit test 
} 

E la tua effettiva attuazione creerebbe vostra classe di configurazione, caricarla con il valore (s) dal appsettings e passare che nella vostra implementazione

+0

Ma la sua implementazione avrebbe ancora bisogno di caricare la sua configurazione dalle impostazioni dell'app nel progetto di test. –

+0

Aggiunto un esempio di come scrivere un test che non avrebbe bisogno delle impostazioni dell'app – boniestlawyer