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);
}
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);
}
Vous pouvez utiliser un MemoryStream pour fournir un flux purement en mémoire pour votre test.
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.