'System.IO.MemoryStream' 类型的对象无法转换为 'ExcelDataReader.IExcelDataReader' 类型
Object of type 'System.IO.MemoryStream' cannot be converted to type 'ExcelDataReader.IExcelDataReader'
我正在使用 xUnit 和 Moq 编写测试用例。
我的 class 有以下代码。
public async Task<DataTable> ReadFromExcel(CloudBlockBlob MasterDataSourceBlob, string SheetName)
{
try
{
DataTable dataInExcelSheet = new DataTable();
using (var memoryStream = new MemoryStream())
{
await MasterDataSourceBlob.DownloadToStreamAsync(memoryStream);
var headers = new List<string>();
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
var excelReader = this._iExcelOperationsMock.CreateReader(memoryStream); // getting error here
DataSet excelDataSet = excelReader.AsDataSet(new ExcelDataSetConfiguration()
{
ConfigureDataTable = (_) => new ExcelDataTableConfiguration()
{
UseHeaderRow = true,
ReadHeaderRow = rowReader =>
{
for (var headercolumnIndex = 0; headercolumnIndex < rowReader.FieldCount; headercolumnIndex++)
headers.Add(Convert.ToString(rowReader.GetValue(headercolumnIndex)));
},
FilterColumn = (columnReader, columnIndex) =>
!string.IsNullOrEmpty(headers[columnIndex])
}
});
excelReader.Close();
dataInExcelSheet = excelDataSet.Tables[SheetName];
dataInExcelSheet = dataInExcelSheet.AsEnumerable().Where((row, index) => !row.ItemArray.All(field => string.IsNullOrEmpty(field as string))).CopyToDataTable();
return dataInExcelSheet;
}
}
catch(Exception ex)
{
throw;
}
}
我的测试class有以下代码
[Fact]
public void ReadFromExcel_Success()
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write("sample data");
writer.Flush();
stream.Position = 0;
var mockExcelOperationsMock = new Mock<IExcelOperationsMock>();
mockExcelOperationsMock.Setup(data => data.CreateReader(It.IsAny<MemoryStream>())).Returns<IExcelDataReader>(
excel =>
{
var item = new Mock<MemoryStream>();
return (IExcelDataReader)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 ExcelOperations(mockExcelOperationsMock.Object);
this._iExcelOperations.ReadFromExcel(mockCloudBlockBlob.Object, SheetName);
}
下面是IExcelOperationsMock.cs文件代码
public interface IExcelOperationsMock
{
IExcelDataReader CreateReader(MemoryStream memoryStream);
}
错误:
Object of type 'System.IO.MemoryStream' cannot be converted to type
'ExcelDataReader.IExcelDataReader'.
我使用以下代码修复了 ReadFromExcel() 中的问题,但没有成功
var excelReader =(IExcelDataReader) this._iExcelOperationsMock.CreateReader(memoryStream);
如何解决上述问题
MemoryStream
不是 IExcelDataReader
,因此不能转换为一个。但是您尝试在 mock
的设置中做到这一点
var mockExcelOperationsMock = new Mock<IExcelOperationsMock>();
mockExcelOperationsMock.Setup(data => data.CreateReader(It.IsAny<MemoryStream>())).Returns<IExcelDataReader>(
excel =>
{
var item = new Mock<MemoryStream>();
return (IExcelDataReader)item.Object;
}
);
重构代码
var reader = new Mock<IExcelDataReader>();
var mockExcelOperationsMock = new Mock<IExcelOperations>();
mockExcelOperationsMock
.Setup(_ => _.CreateReader(It.IsAny<MemoryStream>()))
.Returns(reader.Object);
我正在使用 xUnit 和 Moq 编写测试用例。
我的 class 有以下代码。
public async Task<DataTable> ReadFromExcel(CloudBlockBlob MasterDataSourceBlob, string SheetName)
{
try
{
DataTable dataInExcelSheet = new DataTable();
using (var memoryStream = new MemoryStream())
{
await MasterDataSourceBlob.DownloadToStreamAsync(memoryStream);
var headers = new List<string>();
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
var excelReader = this._iExcelOperationsMock.CreateReader(memoryStream); // getting error here
DataSet excelDataSet = excelReader.AsDataSet(new ExcelDataSetConfiguration()
{
ConfigureDataTable = (_) => new ExcelDataTableConfiguration()
{
UseHeaderRow = true,
ReadHeaderRow = rowReader =>
{
for (var headercolumnIndex = 0; headercolumnIndex < rowReader.FieldCount; headercolumnIndex++)
headers.Add(Convert.ToString(rowReader.GetValue(headercolumnIndex)));
},
FilterColumn = (columnReader, columnIndex) =>
!string.IsNullOrEmpty(headers[columnIndex])
}
});
excelReader.Close();
dataInExcelSheet = excelDataSet.Tables[SheetName];
dataInExcelSheet = dataInExcelSheet.AsEnumerable().Where((row, index) => !row.ItemArray.All(field => string.IsNullOrEmpty(field as string))).CopyToDataTable();
return dataInExcelSheet;
}
}
catch(Exception ex)
{
throw;
}
}
我的测试class有以下代码
[Fact]
public void ReadFromExcel_Success()
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write("sample data");
writer.Flush();
stream.Position = 0;
var mockExcelOperationsMock = new Mock<IExcelOperationsMock>();
mockExcelOperationsMock.Setup(data => data.CreateReader(It.IsAny<MemoryStream>())).Returns<IExcelDataReader>(
excel =>
{
var item = new Mock<MemoryStream>();
return (IExcelDataReader)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 ExcelOperations(mockExcelOperationsMock.Object);
this._iExcelOperations.ReadFromExcel(mockCloudBlockBlob.Object, SheetName);
}
下面是IExcelOperationsMock.cs文件代码
public interface IExcelOperationsMock
{
IExcelDataReader CreateReader(MemoryStream memoryStream);
}
错误:
Object of type 'System.IO.MemoryStream' cannot be converted to type 'ExcelDataReader.IExcelDataReader'.
我使用以下代码修复了 ReadFromExcel() 中的问题,但没有成功
var excelReader =(IExcelDataReader) this._iExcelOperationsMock.CreateReader(memoryStream);
如何解决上述问题
MemoryStream
不是 IExcelDataReader
,因此不能转换为一个。但是您尝试在 mock
var mockExcelOperationsMock = new Mock<IExcelOperationsMock>();
mockExcelOperationsMock.Setup(data => data.CreateReader(It.IsAny<MemoryStream>())).Returns<IExcelDataReader>(
excel =>
{
var item = new Mock<MemoryStream>();
return (IExcelDataReader)item.Object;
}
);
重构代码
var reader = new Mock<IExcelDataReader>();
var mockExcelOperationsMock = new Mock<IExcelOperations>();
mockExcelOperationsMock
.Setup(_ => _.CreateReader(It.IsAny<MemoryStream>()))
.Returns(reader.Object);