.net 类型为'的对象;System.IO.MemoryStream';无法转换为类型';ExcelDataReader.IExcelDataReader';

.net 类型为'的对象;System.IO.MemoryStream';无法转换为类型';ExcelDataReader.IExcelDataReader';,.net,.net-core,moq,xunit,.net,.net Core,Moq,Xunit,我正在使用xUnit和Moq编写测试用例 我的班级有以下代码 public async Task<DataTable> ReadFromExcel(CloudBlockBlob MasterDataSourceBlob, string SheetName) { try { DataTable dataInExcelSheet = new DataTable();

我正在使用xUnit和Moq编写测试用例

我的班级有以下代码

       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;
            }
}
错误:

无法将“System.IO.MemoryStream”类型的对象转换为 “ExcelDataReader.IExcelDataReader”

我使用了下面的代码来修复ReadFromExcel()中的问题,但不起作用

  var excelReader =(IExcelDataReader) this._iExcelOperationsMock.CreateReader(memoryStream);

如何解决上述问题

MemoryStream
不是一个
IEExcelDataReader,因此无法转换为一个。然而,您试图在模拟的设置中做到这一点

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 mockExcelOperationsMock=new Mock();
mockExcelOperationsMock.Setup(data=>data.CreateReader(It.IsAny())。返回(
excel=>
{
var item=new Mock();
返回(IExcelDataReader)item.Object;
}
);
重构代码

var reader = new Mock<IExcelDataReader>();
var mockExcelOperationsMock = new Mock<IExcelOperations>();
mockExcelOperationsMock
    .Setup(_ => _.CreateReader(It.IsAny<MemoryStream>()))
    .Returns(reader.Object);
var reader=newmock();
var mockExcelOperationsMock=new Mock();
模拟操作模拟
.Setup(=>.CreateReader(It.IsAny()))
.Returns(reader.Object);

MemoryStream
不是一个
IEExcelDataReader
,因此不能强制转换为一个。然而,您试图在模拟的设置中做到这一点
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);