Come classe di unit test che legge il file XML?
-
27-09-2019 - |
Domanda
Ho bisogno di scrivere un test di unità per una classe che legge un file xml e analizza il suo contenuto. Come posso Mock la lettura di file? Poiché tutto il contenuto delle prove dovrebbe essere contro il file in lettura.
Io uso nmock2 con NUnit.
Grazie
Soluzione
Come suggerisce rwwilden, la vita è molto più facile se si utilizza un API basato sul flusso invece di un un nome di file-based. Utilizzando beffardo non è appropriato terribilmente qui, IMO; non stai facendo "test di protocollo" -. si desidera solo una fonte di dati
Si può anche fornire un sovraccarico che è un metodo di utilità semplice:
public Result ParseXml(string file)
{
using (Stream stream = File.OpenRead(file))
{
return ParseXml(stream);
}
}
Si potrebbe quindi ragionevolmente in sicurezza non di test che il metodo -. Non ha alcuna logica significativa in esso, dopo tutto
Ora potrebbe testare l'API basato sul flusso utilizzando una stringa hard-coded nel codice, quindi chiamando Encoding.UTF8.GetBytes(xml)
e la costruzione di un MemoryStream
intorno l'array di byte risultante ... ma io in genere preferisco utilizzare i files separati nel mio progetto di test. Impostare il tipo di contenuto a "risorsa incorporata" e quindi utilizzare Assembly.GetManifestResourceStream
per ottenere un flusso al file di test.
Se questo è veramente un file XML normale, però, si vuole veramente fare il parsing da soli? C'è qualche motivo non si vuole lasciare che al quadro, e di esprimere la vostra API sia in termini di API DOM, LINQ to XML, o XmlReader
?
Altri suggerimenti
Tutto quello che dovete fare è trovare un modo per dire al vostro classe che cosa file da leggere. Quindi dipende un po 'da come viene implementata la classe. L'approccio più semplice sarebbe qualcosa di simile a questo:
public class ClassToTest : IClassToTest
{
public Result ParseXml(Stream xml)
{
// Parse xml and return result.
return ...;
}
}
[Test]
public void TestParseXml()
{
// Get xml stream to test from somewhere.
Stream xmlStream = ...;
// Call method to test.
var result = new ClassToTest().ParseXml(xmlStream);
// Assert results.
Assert.IsNotNull(result);
...
}
L'idea è che in qualche modo fornire la classe che si sta eseguendo il test con un file XML che si è creato e di cui si conosce quali risultati Analizza per aspettarsi.