C#将物理文件转换为iformfile

时间:2020-07-03 01:35:54

标签: c# unit-testing .net-core epplus

我试图将物理excel文件读取到IFormFile,但是当我读取该文件时,其内容始终为空,该文件显示字节0。我正在尝试测试一种读取excel文件内容的方法。有没有做过能够将excel文件读取到iformfile的测试的人,或者我该如何编写使用epplus读取文件的单元测试?

ServiceTest.cs

    [Fact]
    public async Task saveFile_test()
    {
        string rootPath = Directory.GetCurrentDirectory();
        string testAssetsFolder = @"Assets\";
        string testFile = "test.xlsx";
        string testFilePath = Path.Combine(rootPath, testAssetsFolder, testFile);

        // Arrange.
        var fileMock = new Mock<IFormFile>();
        var physicalFile = new FileInfo(testFilePath);
        var ms = new MemoryStream();
        var writer = new StreamWriter(ms);
        using (FileStream fs = physicalFile.OpenRead())
        {
            byte[] b = new byte[1024];
            UTF8Encoding temp = new UTF8Encoding(true);

            while (fs.Read(b, 0, b.Length) > 0)
            {
                writer.WriteLine(temp.GetString(b));
            }
        }
        writer.Flush();
        ms.Position = 0;
        var fileName = physicalFile.Name;
        //Setup mock file using info from physical file
        fileMock.Setup(_ => _.FileName).Returns(fileName);
        fileMock.Setup(_ => _.Length).Returns(ms.Length);
        fileMock.Setup(m => m.OpenReadStream()).Returns(ms);
        fileMock.Setup(m => m.ContentDisposition).Returns(string.Format("inline; filename={0}", fileName));
        //...setup other members as needed

        List<IFormFile> files = new List<IFormFile>();
        files.Add(fileMock.Object);

        await _service.saveFile(files, "directory", "subDirectory", default);
    }

Service.cs

    public async Task saveFile(List<IFormFile> files, string directory, string subDirectory, CancellationToken cancellationToken)
    {
        subDirectory = subDirectory ?? string.Empty;
        var target = Path.Combine(directory, subDirectory);

        Directory.CreateDirectory(target);

        foreach (IFormFile file in files)
        {
            if (file.Length <= 0) return;
            var filePath = Path.Combine(target, file.FileName);
            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                await file.CopyToAsync(stream, cancellationToken);
                try
                {
                    // add to read encoded 1252 values
                    using (var package = new ExcelPackage(stream))
                    {

                        // Express worksheet
                        ExcelWorksheet worksheet = package.Workbook.Worksheets["Express"];
                        int colCount = worksheet.Dimension.End.Column;  //get Column Count
                        int rowCount = worksheet.Dimension.End.Row;

                        ....

1 个答案:

答案 0 :(得分:0)

您应该能够使用 ExcelDataReader.ExcelReaderFactory

 using (var stream = file.OpenReadStream())
            {
                using (var reader = ExcelReaderFactory.CreateReader(stream))
                {
                    
                        reader.Read(); /* Header row - we ignore this */
                        do
                        {
                            while (reader.Read())
                            {
                                {
                                    var username = reader.GetString(0);
                                    var firstName = reader.GetString(1);
....