2009-05-11 11 views
2

J'essaie de tester l'unité d'un fichier. J'ai une interface qui définit un document, et je passe un objet concret qui implémente cette interface à la méthode Save, et cela fonctionne dans la pratique, mais j'essaie de le tester unitaire pour s'assurer qu'il fonctionnera toujours (et je m essayant désespérément de rattraper les tests unitaires après une période de «temps critique»).une interface simulée sera-t-elle encore sérialisée dans un fichier?

Ma méthode de sauvegarde est assez simple, cela fonctionne comme ceci:

public Boolean SaveDocument(IDocument document) 
{ 
    BinaryFormatter bFormatter = new BinaryFormatter(); 
    FileStream fs = null; 

    try 
    { 
     if (!Directory.Exists(folderName)) 
      Directory.CreateDirectory(folderName); 

     String path = Path.Combine(Path.Combine(folderName, document.FileName), document.Extension); 
     using (fs = new FileStream(path, FileMode.OpenOrCreate)) 
     { 
      bFormatter.Serialize(fs, document); 
     } 
    } 
    catch (IOException ioex) 
    { 
     LOG.Write(ioex.Message); 
     return false; 
    } 

    return true; 
} 

et mon test est:

[Test] 
public void can_save_a_document() 
{ 
    String testDirectory = "C:\\Test\\"; 
    m_DocumentHandler = new DocumentHandler(testDirectory); 

    DynamicMock mock = new DynamicMock(typeof(IDocument)); 

    mock.ExpectAndReturn("get_FileName", "Test_File"); 
    mock.ExpectAndReturn("get_Extension", ".TST"); 

    m_DocumentHandler.SaveDocument(mock.MockInstance as IDocument); 

    try 
    {  
     Assert.IsTrue(Directory.Exists(testDirectory), "Directory was not created"); 
     String[] filesInTestDir = Directory.GetFiles(testDirectory); 

     Assert.AreEqual(1, filesInTestDir.Length, "there is " + filesInTestDir.Length.ToString() + " files in the folder, instead of 1"); 
     Assert.AreEqual(Path.GetFileName(filesInTestDir[0]), "Test_File.TST"); 
    } 
    finally 
    { 
     Directory.Delete(testDirectory); 
     Assert.IsFalse(Directory.Exists(testDirectory), "folder was not cleaned up"); 
    } 
} 

Je suis conscient que sérialisation une interface preserves the concrete data, mais l'interface moqué sérialiser?

Répondre

1

Le composant BinaryFormatter utilise le type réel de l'objet transmis - pas l'interface - lorsqu'il sérialise les données. Donc, en interne, il écrira quelque chose comme Type: MyLib.Objects.MyObj, MyLib quand vous passez un objet réel et Tapez: Moq.ConcreteProxy, Moq, etc. lorsque vous passez un objet fantaisie. L'utilisation de BinaryFormatter pour la persistance va vous causer des problèmes de toute façon car vous devez gérer les différences de versions et de mises en page de mémoire entre les versions. Vous feriez mieux d'établir un format bien défini pour votre document et d'écrire les objets et les champs manuellement.

0

Si vous devez tester le fonctionnement de la sérialisation avec une classe, créez des classes réelles pour le test et utilisez-les. La simulation est utile pour tester les interactions entre objets collaboratifs.