如何在C#中编写Memory Stream的单元测试?

时间:2019-05-17 06:44:42

标签: c# xunit

嗨,我正在用C#编写单元测试。我正在编写用于使用openXML下载excel文件的单元测试。下面是我的单元测试。

 [Fact]
      public void ShouldAddErrorColumnAtTheEnd()
      {
        var stream = new MemoryStream();
        var expectedHeaders = new[]
        {
          "Keycode",
          "Store",
          "Date On Range",
          "Date Off Range",
          "LSPL",
          "Active",
          "Ranged",
          "Errors",
        };
        var expectedRows = new[]
        {
          new string[] { "DEF", "1001",  "01/01/2100", "02/02/2100", "-1", "Y", "Y", "Oh no! Bad Lspl" }
        };

        var parameterUploadRepository = mockProvider.GetDependency<IParameterUploadRepository>();
        parameterUploadRepository.GetById(uploadId)
          .Returns(new ParameterUpload()
          {
            Type = Constants.ParameterUploadType.KeycodeParameterUpload,
            ID = uploadId,
          });

        var keycodeParameterChangesWithErrors = new List<KeycodeParameterChange>()
        {
          new KeycodeParameterChange()
          {
            UploadId = uploadId,
            Keycode = "DEF",
            Store = "1001",
            OnRange = "01/01/2100",
            OffRange = "02/02/2100",
            Lspl = "-1",
            Active = "Y",
            Ranged = "Y",
            Errors = "Oh no! Bad Lspl",
          }
        };
        parameterUploadRepository.GetKeycodeParameterChangesWithErrors(uploadId)
          .Returns(keycodeParameterChangesWithErrors);

        IEnumerable<string> actualHeaders = null;
        IEnumerable<IEnumerable<string>> actualRows = null;
        var excelService = mockProvider.GetDependency<IExcelWriterService>();
        excelService.WriteExcelUsingOpenXML(
            Arg.Do<IEnumerable<string>>(headers => actualHeaders = headers),
            Arg.Do<IEnumerable<IEnumerable<string>>>(rows => actualRows = rows),
            Constants.KeycodeParameterUpload.SheetName)
          .Returns(???);

        subject.GetUploadSyncErrors(uploadId);

        actualHeaders.ShouldBe(expectedHeaders);
        actualRows.ShouldBe(expectedRows);
      }

我面临的问题是excelService.WriteExcelUsingOpenXML。 WriteExcelUsingOpenXML的实现如下。

public MemoryStream WriteExcelUsingOpenXML(IEnumerable<string> headers, IEnumerable<IEnumerable<string>> values, string worksheetName)
    {
      var stream = new MemoryStream();
      var headersArray = headers.ToArray();
      using (SpreadsheetDocument document = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook))
      {
        WorkbookPart workbookPart = document.AddWorkbookPart();
        workbookPart.Workbook = new Workbook();

        WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
        worksheetPart.Worksheet = new Worksheet();

        Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets());

        Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = Constants.TimephaseWorksheet };

        sheets.Append(sheet);

        workbookPart.Workbook.Save();

        SheetData sheetData = worksheetPart.Worksheet.AppendChild(new SheetData());

        // Constructing header
        Row row = new Row();

        row.Append(
            ConstructCell(headersArray[0], CellValues.Number),
            ConstructCell(headersArray[1], CellValues.Number),
            ConstructCell(headersArray[2], CellValues.Date),
            ConstructCell(headersArray[3], CellValues.Number),
            ConstructCell(headersArray[4], CellValues.String));

        // Insert the header row to the Sheet Data
        sheetData.AppendChild(row);
        // Inserting each employee
        foreach (var valuesEnumeration in values)
        {
          row = new Row();
          var flattend = valuesEnumeration.ToArray();
          row.Append(
              ConstructCell(flattend[0], CellValues.Number),
              ConstructCell(flattend[1], CellValues.String),
              ConstructCell(flattend[2], CellValues.String),
              ConstructCell(flattend[3], CellValues.Number),
              ConstructCell(flattend[4], CellValues.String));

          sheetData.AppendChild(row);
        }

        worksheetPart.Worksheet.Save();
      }

      return stream;
    }

我不确定该退还什么

excelService.CreateExcelPackage(
            Arg.Do<IEnumerable<string>>(headers => actualHeaders = headers),
            Arg.Do<IEnumerable<IEnumerable<string>>>(rows => actualRows = rows),
            Constants.KeycodeParameterUpload.SheetName)
          .Returns(????);

有人可以帮我完成这个吗?任何帮助,将不胜感激。谢谢

1 个答案:

答案 0 :(得分:0)

您可以测试内存流的长度。如果失败,它将小于1。如果需要,您还可以从内存流中重新组装工作表。

相关问题