如何为使用流作为参数的方法编写 unitTest
How to write unitTest for methods using a stream as a parameter
我有 class 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 文件作为嵌入式资源吗?参见 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);
}
使用 JustMock、TypeMock 或 Microsoft Fakes 等隔离框架,您将能够模拟 Stream。
坏消息是,据我所知,所有这些都是有偿的。
我的解决方案是将 Stream
包装在您自己的 class 中,我们将其命名为 StreamWrapper
,它实现了接口 IStream
。现在将导入签名更改为
public bool Import(IStream stream)
现在您可以模拟该流,如果您想在生产代码中使用它,您应该通过 StreamWrapper
否则 Mock。
我有 class 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 文件作为嵌入式资源吗?参见 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);
}
使用 JustMock、TypeMock 或 Microsoft Fakes 等隔离框架,您将能够模拟 Stream。
坏消息是,据我所知,所有这些都是有偿的。
我的解决方案是将 Stream
包装在您自己的 class 中,我们将其命名为 StreamWrapper
,它实现了接口 IStream
。现在将导入签名更改为
public bool Import(IStream stream)
现在您可以模拟该流,如果您想在生产代码中使用它,您应该通过 StreamWrapper
否则 Mock。