2010-06-13 14 views
5

Ich muss eine Unit-Tests für eine Klasse schreiben, die eine XML-Datei liest und analysiert den Inhalt. Wie kann ich die Datei lesen Mock? Weil der gesamte Inhalt der Tests gegen die gelesene Datei sein sollte.Wie Einheit Testklasse, die XML-Datei liest?

Ich benutze nmock2 mit nUnit.

Dank

Antwort

6

Wie rwwilden suggeriert, ist das Leben viel einfacher, wenn Sie eine stream-basierte API anstelle einer dateinbasierten verwenden. Spott zu spielen ist hier nicht besonders angebracht, IMO; Sie tun nicht "Protokolltest" - Sie wollen nur eine Datenquelle.

Sie können auch eine Überlastung schaffen, die eine einfache Dienstprogramm Methode ist:

public Result ParseXml(string file) 
{ 
    using (Stream stream = File.OpenRead(file)) 
    { 
     return ParseXml(stream); 
    } 
} 

Sie könnte dann einigermaßen sicher nicht Test, dass Verfahren - es darin keine signifikante Logik hat, nachdem alle.

Jetzt Sie konnte Test der Stream-basierte API durch eine hartcodierte Zeichenfolge in Ihrem Code verwenden, dann Encoding.UTF8.GetBytes(xml) Aufruf und der Aufbau einer MemoryStream um das resultierende Byte-Array ... aber ich ziehe es generell separate Datendateien verwenden in meinem Testprojekt. Setzen Sie den Inhaltstyp auf "eingebettete Ressource" und verwenden Sie dann Assembly.GetManifestResourceStream, um einen Stream zur Testdatei zu erhalten.

Wenn das wirklich eine normale XML-Datei ist, wollen Sie das Parsing wirklich selbst machen? Gibt es einen Grund, warum Sie das dem Framework nicht überlassen wollen, und Ihre API entweder in Bezug auf die DOM API, LINQ to XML oder XmlReader ausdrücken?

+0

Für jeden anderen, der darüber verwirrt ist, wie der Pfad hier funktioniert, scheint er ungefähr so ​​zu sein: 'Your.Project.Name.SubFolder.FileName.extension'. – crush

3

Alles, was Sie tun müssen, ist, einen Weg finden, Ihre Klasse zu sagen, welche Datei zu lesen. Es hängt also ein wenig davon ab, wie Ihre Klasse implementiert ist. Der einfachste Ansatz wäre so etwas wie dieses:

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); 
    ... 
} 

Die Idee ist, dass man irgendwie die Klasse bieten Ihnen eine XML-Datei testen, die Sie erstellt und für die Sie wissen, welche Ergebnisse analysieren zu erwarten.

+0

Ich möchte nicht das Lesen der Datei überprüfen. Ich will nur UnitTest das Parsing. Mock-System kann mir irgendwie helfen? –

+0

Vielleicht könnten Sie Code der Methode oder Klasse angeben, die Sie testen möchten? –