2010-06-13 12 views

Répondre

6

Comme le suggère rwwilden, la vie est beaucoup plus facile si vous utilisez une API basée sur les flux au lieu d'une API basée sur un nom de fichier. Utiliser la moquerie n'est pas très approprié ici, OMI; vous ne faites pas de "test de protocole" - vous voulez juste une source de données.

Vous pouvez également fournir une surcharge qui est une méthode simple utilitaire:

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

Vous pouvez ensuite raisonnablement en toute sécurité pas test de cette méthode - il n'a pas de logique significative, après tout.

Maintenant, vous pourrait tester l'API basée sur les flux en utilisant une chaîne codée en dur dans votre code, puis en appelant Encoding.UTF8.GetBytes(xml) et la construction d'un MemoryStream autour du tableau d'octets résultant ... mais je préfère généralement utiliser des fichiers de données séparés dans mon projet de test. Définissez le type de contenu sur "ressource intégrée", puis utilisez Assembly.GetManifestResourceStream pour obtenir un flux vers le fichier de test.

Si c'est vraiment un fichier XML normal, voulez-vous vraiment faire l'analyse vous-même? Y at-il une raison pour laquelle vous ne voulez pas laisser cela à l'infrastructure, et exprimer votre API soit en termes de l'API DOM, LINQ to XML, ou XmlReader?

+0

Pour quelqu'un d'autre confus sur la façon dont le chemin fonctionne ici, il semble être quelque chose comme ce qui suit: 'Your.Project.Name.SubFolder.FileName.extension'. – crush

3

Tout ce que vous avez à faire est de trouver un moyen de dire à votre classe ce fichier à lire. Cela dépend donc un peu de la façon dont votre classe est implémentée. L'approche la plus simple serait quelque chose comme ceci:

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'idée est que vous fournissez en quelque sorte la classe que vous testez avec un fichier xml que vous avez créé et pour lequel vous savez ce que parser les résultats à attendre.

+0

Je ne veux pas vérifier la lecture du fichier. Je veux seulement tester UnitTest l'analyse. Système de simulation peut en quelque sorte m'aider? –

+0

Peut-être que vous pourriez fournir un code de la méthode ou de la classe que vous souhaitez tester? –