2016-11-28 66 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);