2016-11-28 1 views
0

私はInputStreamを持っている場所でアクションをテストしようとしていますが、実際にどのように実行するのかわかりません。SystemWrapperでMoqを使用するC#MVC

私はクラスを嘲笑しようとしています。抽象レイヤーを持たないため、System.IOをモックできないことに気付きました。

検索の結果、IOシステムの抽象レイヤーを追加してラップするパッケージを使用するようになりました。 "SystemWrapper"ですが、私はそれを使用することに成功しませんでした。

私の目標: は形式が、それは偽の他にtrueになりますexcpected場合、それはcanvaフォーマットと同じだ場合はExcelファイルのヘッダをチェックすることです。

私のコードがある:私がテストしたい

機能:

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; 

}

テスト機能:私の入力ストリーム enter image description here

[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); 
    } 

タイプ または、私にそれに続く別のアプローチを与えることができるなら、それはあなたから素晴らしいでしょう。

おかげ

+1

file.filePath.InputStream' 'の種類は何ですか?理由はありますか?ストリームだけではありませんか? –

+0

@NickBailey上記のようにHttpPostedFileBaseは –

+0

です。コードを外部の依存関係に強く結ぶほど、単体テストをより難しくすることができます。あなたのコードをテストすることの難しさは、あなたのコードがどれだけうまく設計されているかを直接反映しています。あなたがコードを実装することが実装上の問題に依存する場合、テストのためにそれらを偽造しようとすると、あなた自身が問題を設定しています – Nkosi

答えて

0

あなたは例えば、テストファイルへのStreamReaderのBaseStreamを返すようにInputStreamを設定することにより、それを模擬することができます。:

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