I am using xUnit and Moq for writing unit tests.
My ExcelData class has below code
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);
}
Inorder to mock ExcelReaderFactory.CreateReader()
, I created new class and Interface as below and returned IExcelDataReader .
ExcelDataMock.cs file has below code
public class ExcelDataMock
{
public IExcelDataReader CreateReader(MemoryStream memoryStream)
{
return ExcelReaderFactory.CreateReader(memoryStream);
}
}
IExcelDataMock.cs file has below code
public interface IExcelDataMock
{
IExcelDataReader CreateReader(MemoryStream memoryStream);
}
My Test class has below code
[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);
}
If I use ExcelReaderFactory.CreateReader(memoryStream)
I got below error
No data is available for encoding 1252. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.'
If I use this._iExcelOperationsMock.CreateReader(memoryStream)
I got error as below
System.ArgumentException: 'Object of type 'System.IO.MemoryStream' cannot be converted to type 'ExcelDataReader.IExcelDataReader'.'
How to resolve this issue.
Update 1:
Error:
invalid file signature