web-dev-qa-db-fra.com

Comment écrire un test unitaire pour les méthodes utilisant un flux comme paramètre

J'ai la classe ImportProvider, et je veux écrire un test unitaire pour la méthode d'importation.

Mais cela devrait être un test unitaire, donc je ne veux pas lire le fichier pour le diffuser. Une idée?

public class ImportProvider : IImportProvider
{ 
     public bool Import(Stream stream)
     {
         //Do import

         return isImported;
     }
}

public interface IImportProvider
{
      bool Import(Stream input);
}

Il s'agit d'un test unitaire:

[TestMethod]
public void ImportProvider_Test()
{
    // Arrange           
    var importRepository = new Mock<IImportRepository>(); 
    var imp = new ImportProvider(importRepository.Object);
    //Do setup...

    // Act
    var test_Stream = ?????????????
    // This working but not option:
    //test_Stream = File.Open("C:/ExcelFile.xls", FileMode.Open, FileAccess.Read);
    var result = imp.Import(test_Stream);

    // Assert    
    Assert.IsTrue(result);
}
22
Raskolnikov

Utilisez un MemoryStream. Vous ne savez pas ce que votre fonction attend, mais pour y insérer une chaîne UTF-8 par exemple:

//Act
using (var test_Stream = new MemoryStream(Encoding.UTF8.GetBytes("whatever")))
{
    var result = imp.Import(test_Stream);

    // Assert    
    Assert.IsTrue(result);
}

EDIT: Si vous avez besoin d'un fichier Excel et que vous ne parvenez pas à lire des fichiers à partir du disque, pourriez-vous ajouter un fichier Excel en tant que ressource intégrée dans votre projet de test? Voir Comment intégrer et accéder aux ressources en utilisant Visual C #

Vous pouvez ensuite lire un flux comme celui-ci:

//Act
using (var test_Stream = this.GetType().Assembly.GetManifestResourceStream("excelFileResource"))
{
    var result = imp.Import(test_Stream);

    // Assert    
    Assert.IsTrue(result);
}
41
GazTheDestroyer

Vous pouvez utiliser un MemoryStream pour fournir un flux purement en mémoire pour votre test.

4
James Lucas

Utilisez un framework d'isolation comme JustMock, TypeMock ou Microsoft Fakes et vous pourrez vous moquer du Stream.

La mauvaise nouvelle, c'est que tous, à ma connaissance, sont payés.

0