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

È stato utile?

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.

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