Domanda

Prima di tutto, mi rendo conto che questa domanda è pericolosamente vicino a:Come MapPath in una unità di prova in C#

Spero però che non ha una soluzione diversa.Il mio problema seguente:

Nel mio codice ho un oggetto che deve essere convalidato.Io sono la creazione di test di unità per ogni metodo di validazione per verificare la convalida correttamente.Io sono la creazione di mock dati e il caricamento in oggetto, quindi la convalida.Il problema è che all'interno della convalida, quando si verifica un errore, un errore di codice è assegnato.Questo codice di errore viene utilizzata per raccogliere informazioni sull'errore da un file xml utilizzando Server.MapPath.Tuttavia, quando si cerca di ottenere il file xml, viene generata un'eccezione che significa che il file non può essere trovato.

Dal MapPath è nel mio codice di convalida, e non è il mio test di unità, come faccio a ottenere la mia unità di test per riconoscere il percorso?Fa questa domanda ha senso?

Linea di errore (Nel mio codice di Convalida NON è il mio test di unità):

XDocument xdoc = XDocument.Load(HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml"));

Semplificata:L'Unità di chiamate di Prova di un metodo nel mio programma che si chiama Server.MapPath che poi non riesce.

È stato utile?

Soluzione

Vorrei astratto il "fornitore di nome di file" in una classe che restituisce semplicemente una posizione, allora si può prendere in giro molto, molto più facile.

public class PathProvider
{
    public virtual string GetPath()
    {
        return HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml");
    }
}

Quindi, è possibile utilizzare la classe PathProvider direttamente ...

PathProvider pathProvider = new PathProvider();
XDocument xdoc = XDocument.Load(pathProvider.GetPath());

o modelli fuori nei test:

PathProvider pathProvider = new MockPathProvider(); // using a mocking framework
XDocument xdoc = XDocument.Load(pathProvider.GetPath());

Altri suggerimenti

Dopo alcuni rigorosi googling e con l'aiuto di un collega si avvicinò con una soluzione semplice e già .net

Sopra l'unità di test che accede al processo di validazione, ho aggiunto:

 [TestMethod()]
 [HostType("ASP.NET")]
 [UrlToTest("http://localhost:###/upload_file.aspx")]
 [AspNetDevelopmentServerHost("Path To Web Application", "Path To Web Root")]

Questo funziona perfettamente.Fondamentalmente, quando il test viene chiamato, si carica l'URL specificato di test di unità nel caricamento della pagina.Poiché si tratta di un sito web che è ora chiamata di test di unità, la validazione avere accesso al Server.MapPath.Questa soluzione potrebbe non funzionare per tutti, ma è stato perfetto per questo.Grazie a tutti avete contribuito.

Prova ad usare Rhino Mocks o un quadro di scherno alternativa per deridere il HttpContext (o altri oggetti dipendenti) Oppure si potrebbe scrivere i propri oggetti mock. Oppure scrivere una classe MapPathWrapper, ereditare da una classe MapPathWrapperBase per l'ambiente reale, allora dentro per il test di unità creare un oggetto MockMapPathWrapper.

Non ci dovrebbero essere molti esempi per beffarda su SO.

Ecco quello che ho chiesto:

Come usare Rhino Mocks per deridere un HttpContext .application

Aggiorna Ho solo esperienza facendo questo con l'Asp.Net MVC, con webforms ho ImageIN che sarebbe stato molto più difficile a causa della mancanza di una classe HttpContextBase.

Vorrei estrarre i metodi che accettano le dipendenze come argomenti:

public void Validate(HttpContext context)
{
    ValidatePath(context.Server.MapPath("App_Data/ErrorCodes.xml"));
}

public void ValidatePath(string path)
{
    XDocument xdoc = XDocument.Load(path);
    ValidateDocument(xdoc);
}

public void ValidateDocument(XDocument xdoc)
{
    // Original code
}

È quindi possibile testare i vari metodi in modo indipendente. Ad esempio, test come ValidatePath() gestisce un file mancante.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top