2016-11-28 50 views
0

我想测试一个动作,我有一个InputStream,我真的不知道如何进行。与SystemWrapper使用Moq要单元测试一个动作c#MVC

我在嘲笑这个类,我发现我们不能模拟System.IO,因为我们没有抽象层。

所以,在一些搜索之后,我将面向使用一个添加了IO系统抽象层并包装它的软件包。是“SystemWrapper”,但我没有成功使用它。

我的目标: 是办理登机手续的Excel文件头,如果是一样的canva格式,如果格式excpected这将是真实的,否则返回false。

有我的代码:

功能,我想测试:

public bool checkFileHeaders(UploadedFile file) 
{ 
    ExcelPackage package = new ExcelPackage(file.filePath.InputStream); 
    ExcelWorksheet worksheet = package.Workbook.Worksheets[1]; 
    List<string> expectedArray = new List<string>(); 
    List<string> array = new List<string>(); 
    bool checkExprectedArrayWithReelArray = true; 
    switch (file.typeFile) 
    { 
     case "headcount": 
     expectedArray.AddRange(new string[] { "MLE", "NOM", "PRENOM", "type"  }); 
    try 
    { 
     array.AddRange(new string[] { (string)worksheet.Cells["A1"].Value, (string)worksheet.Cells["B1"].Value, (string)worksheet.Cells["C1"].Value, (string)worksheet.Cells["D1"].Value}); 
    } 
    catch 
    { 
     checkExprectedArrayWithReelArray = false; 
    } 
    case "File2": 
    expectedArray.AddRange(new string[] { "Field1", "Field2", "Field3" }); 
    try 
    { 
     array.AddRange(new string[] { (string)worksheet.Cells["A1"].Value, (string)worksheet.Cells["B1"].Value, (string)worksheet.Cells["C1"].Value}); 
    } 
    catch 
    { 
     checkExprectedArrayWithReelArray = false; 
    } 
} 

checkExprectedArrayWithReelArray = Enumerable.SequenceEqual(expectedArray.OrderBy(t => t), array.OrderBy(t => t)); 
package.Dispose(); 
return checkExprectedArrayWithReelArray; 

}

测试功能:

[TestMethod] 
    public void CheckFileHeaders_STCWithExpectedFormat_ShouldReturnTrue() 
    { 
     var mockFileStream = new Mock<FileStreamWrap>(); 

     var _mockHttpStream = new Mock<HttpPostedFileBase>(); 
     _mockHttpStream.Setup(f => f.InputStream) 
     .Returns(??????); 


     OpsReview.Core.Parsers.UploadedFile file = new OpsReview.Core.Parsers.UploadedFile 
     { 
      typeFile = "stc", 
      filePath = _mockHttpStream.Object 
     }; 
     var result = _controller.checkFileHeaders(file); 
     result.Should().Be(true); 
    } 

我的输入流的类型 enter image description here 或者,如果你可以给我另一种方法来跟踪它,这对你来说会很棒。

感谢

+1

什么'file.filePath.InputStream'类型嘲笑呢?有没有理由不能只是一个'Stream'? –

+0

@NickBailey它是一个HttpPostedFileBase,你可以在上面看到 –

+0

你越紧密地将你的代码连接到外部依赖关系,你就越难让它进行单元测试。测试代码的难度直接反映了您的代码设计得有多好。如果你的代码依赖于执行的担忧,那么你设置你的自我弥补问题,当你试图伪造起来进行测试 – Nkosi

回答

0

您可以通过设置的InputStream返回一个StreamReader的BaseStream到测试文件,例如:

var mockPostedFileBase = new Mock<HttpPostedFileBase>(); 
mockPostedFileBase.SetupGet(s => s.InputStream).Returns(new StreamReader(/* path to test file */).BaseStream);