c# - 如何为使用流作为参数的方法编写 unitTest

标签 c# unit-testing stream

我有类 ImportProvider ,我想为 Import 方法编写单元测试。

但这应该是单元测试,所以我不想从文件读取到流。 有什么想法吗?

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

         return isImported;
     }
}

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

这是单元测试:

[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);
}

最佳答案

使用内存流。不确定您的函数期望什么,但是例如将 UTF-8 字符串填充到其中:

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

    // Assert    
    Assert.IsTrue(result);
}

编辑:如果您需要一个 Excel 文件,并且您无法从磁盘读取文件,您可以将 Excel 文件作为嵌入式资源添加到您的测试项目中吗?参见 How to embed and access resources by using Visual C#

然后您可以像这样读取流:

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

    // Assert    
    Assert.IsTrue(result);
}

关于c# - 如何为使用流作为参数的方法编写 unitTest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30212279/

相关文章:

unit-testing - Grails升级2.2-> 2.3.7后,Spock测试失败

c++ - 为什么 istream::operator>> 没有采用 char 的重载?

java - 并行读取文件时内存不足

c# - 如何将图像流嵌入到 MailMessage

c# - 获取所有业务部门

c# - 如何有效地将数百万条记录从 .NET 流式传输到 SQL Server

unit-testing - 如何在 Rust 中模拟特定方法而不是所有方法?

javascript - 无法在 JavaScript 中访问模型的属性

c# - ServiceStack AppHostHttpListenerBase 无法连接到远程服务器

c# - 如何在 C# 中创建涉及集合的单元测试?