我有类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);
}
答案 0 :(得分:38)
使用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);
}
答案 1 :(得分:4)
您可以使用MemoryStream为您的测试提供纯粹的内存流。
答案 2 :(得分:0)
使用像JustMock,TypeMock或Microsoft Fakes这样的隔离框架,你就可以模拟Stream了。
坏消息是,就我所知,所有这些都是有偿的。
答案 3 :(得分:-1)
我的解决方案是将Stream
包装在您自己的类中,让它命名为StreamWrapper
,实现接口IStream
。现在将导入签名更改为
public bool Import(IStream stream)
现在你可以模拟那个流,如果你想在生产代码中使用它,你应该通过StreamWrapper
否则模拟。