类型'System.IO.MemoryStream'的对象不能转换为类型'ExcelDataReader.IExcelDataReader'

时间:2019-07-19 13:35:27

标签: .net .net-core moq xunit

我正在使用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;
            }
}

我的测试班级有下面的代码

       [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);
    }

错误:

  

类型为'System.IO.MemoryStream'的对象不能转换为类型   “ ExcelDataReader.IExcelDataReader”。

enter image description here

我使用以下代码修复了ReadFromExcel()中的问题,但没有成功

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

如何解决上述问题

1 个答案:

答案 0 :(得分:0)

MemoryStream不是IExcelDataReader,因此不能转换为1。但是,您尝试在模拟程序的设置中做到这一点

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);