.net core 如何模拟ExcelReaderFactory.CreateReader并返回IExcelDataReader数据
我正在使用xUnit和Moq编写单元测试 我的ExcelData类包含以下代码.net core 如何模拟ExcelReaderFactory.CreateReader并返回IExcelDataReader数据,.net-core,moq,azure-storage-blobs,xunit,.net Core,Moq,Azure Storage Blobs,Xunit,我正在使用xUnit和Moq编写单元测试 我的ExcelData类包含以下代码 public DataTable ReadFromExcel(CloudBlockBlob MasterDataSourceBlob, string SheetName) { DataTable dataInExcelSheet = new DataTable(); using (var memoryStream = new MemoryS
public DataTable ReadFromExcel(CloudBlockBlob MasterDataSourceBlob, string SheetName)
{
DataTable dataInExcelSheet = new DataTable();
using (var memoryStream = new MemoryStream())
{
MasterDataSourceBlob.DownloadToStreamAsync(memoryStream);
var headers = new List<string>();
IExcelDataReader excelReader = ExcelReaderFactory.CreateReader(memoryStream);
}
public class ExcelDataMock
{
public IExcelDataReader CreateReader(MemoryStream memoryStream)
{
return ExcelReaderFactory.CreateReader(memoryStream);
}
}
public interface IExcelDataMock
{
IExcelDataReader CreateReader(MemoryStream memoryStream);
}
IExcelDataMock.cs文件包含以下代码
public DataTable ReadFromExcel(CloudBlockBlob MasterDataSourceBlob, string SheetName)
{
DataTable dataInExcelSheet = new DataTable();
using (var memoryStream = new MemoryStream())
{
MasterDataSourceBlob.DownloadToStreamAsync(memoryStream);
var headers = new List<string>();
IExcelDataReader excelReader = ExcelReaderFactory.CreateReader(memoryStream);
}
public class ExcelDataMock
{
public IExcelDataReader CreateReader(MemoryStream memoryStream)
{
return ExcelReaderFactory.CreateReader(memoryStream);
}
}
public interface IExcelDataMock
{
IExcelDataReader CreateReader(MemoryStream memoryStream);
}
我的测试类有以下代码
[Fact]
public void ReadFromExcel_Success()
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write("sample data");
writer.Flush();
stream.Position = 0;
var mockExcelDataMock = new Mock<IExcelDataMock>();
mockExcelDataMock.Setup(data => data.CreateReader(It.IsAny<MemoryStream>())).Returns<IExcelDataReader>(
excel =>
{
var item = new Mock<IExcelDataReader>();
return item.Object;
}
);
var mockCloudBlockBlob = new Mock<CloudBlockBlob>(new Uri("https://samplestorage.blob.core.windows.net/samplecontainer"));
mockCloudBlockBlob.Setup(blob => blob.DownloadToStreamAsync(It.IsAny<Stream>()))
.Callback((Stream target) => stream.CopyTo(target))
.Returns(Task.CompletedTask);
string SheetName = null;
this._iExcelOperations = new ExcelData(mockExcelDataMock.Object);
this._iExcelOperations.ReadFromExcel(mockCloudBlockBlob.Object, SheetName);
}
[事实]
public void ReadFromExcel_Success()
{
var stream=newmemoryStream();
var writer=新的StreamWriter(流);
写入(“样本数据”);
writer.Flush();
流位置=0;
var mockExcelDataMock=new Mock();
mockExcelDataMock.Setup(data=>data.CreateReader(It.IsAny())。返回(
excel=>
{
var item=new Mock();
返回项。对象;
}
);
var mockCloudBlockBlob=new Mock(新Uri(“https://samplestorage.blob.core.windows.net/samplecontainer"));
mockCloudBlockBlob.Setup(blob=>blob.DownloadToStreamAsync(It.IsAny()))
.Callback((流目标)=>Stream.CopyTo(目标))
.Returns(Task.CompletedTask);
字符串SheetName=null;
此._iExcelOperations=新的ExcelData(mockExcelDataMock.Object);
这是.\u iExcelOperations.ReadFromExcel(mockCloudBlockBlob.Object,SheetName);
}
如果我使用ExcelReaderFactory.CreateReader(memoryStream)
没有可用于编码1252的数据。有关定义
自定义编码,请参阅文档以了解
Encoding.RegisterProvider方法。“
如果我使用this.\u iExcelOperationsMock.CreateReader(memoryStream)
我得到如下错误
System.ArgumentException:'类型为'System.IO.MemoryStream'的对象
无法转换为类型“ExcelDataReader.IExcelDataReader”
如何解决这个问题
更新1:
错误:
无效的文件签名
我们需要更好地查看您显示的代码。当前的代码片段太不连贯,无法完全理解所询问的内容。实际上,我无法模拟ExcelReaderFactory.CreateReader(memoryStream)。这是给定的错误。请建议解决方案。您提供的示例代码不完整,因此难以提供信息不完整的正确解决方案。提供一个澄清您的具体问题的示例我还注意到您正在调用
MasterDataSourceBlob.DownloadToStreamAsync(memoryStream)代码>在同步方法中,这将导致问题谢谢您的建议。根据添加System.Text.Encoding.CodePages后,问题已得到解决。现在,我遇到了我在相关更新1中指定的不同问题。