繁体   English   中英

如何使用流作为参数为方法编写unitTest

[英]How to write unitTest for methods using a stream as a parameter

我有类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);
}

使用MemoryStream。 不确定你的函数需要什么,但是要将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文件作为嵌入式资源? 请参见如何使用Visual C#嵌入和访问资源

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

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

    // Assert    
    Assert.IsTrue(result);
}

您可以使用MemoryStream为测试提供纯内存流。

使用像JustMock,TypeMock或Microsoft Fakes这样的隔离框架,您将能够模拟Stream。

坏消息是,据我所知,所有这些都是有偿的。

我的解决方案是将Stream包装在您自己的类中,让我们将其命名为StreamWrapper ,它实现了接口IStream 现在将导入签名更改为

public bool Import(IStream stream)

现在你可以模拟那个流,如果你想在生产代码中使用它,你应该传递StreamWrapper否则Mock。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM