2016-04-14 4 views
1

私は、MVCアプリケーションのコントローラから呼び出され、次にExcelファイルを出力するメソッド(下記)を持っています。このメソッドをUnitTestする方法は適切ですか?

方法:

public static void ExportToExcel(IEnumerable<dynamic> data, string bookName, string sheetName) 
{ 
    XLWorkbook workbook = new XLWorkbook(); 
    var worksheet = workbook.Worksheets.Add(sheetName); 
    worksheet.Cell(1, 1).InsertTable(data); 

    HttpContext.Current.Response.Clear(); 
    HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
    HttpContext.Current.Response.AddHeader("content-disposition", String.Format(@"attachment;filename={0}.xlsx", bookName.Replace(" ", "_"))); 

    using (MemoryStream memStream = new MemoryStream()) 
    { 
     workbook.SaveAs(memStream); 
     memStream.WriteTo(HttpContext.Current.Response.OutputStream); 
     memStream.Close(); 
    } 
    HttpContext.Current.Response.End(); 
} 

コントローラー:

[ActionName("ExportData")] 
public ActionResult ExportData() 
{ 
    ExcelExport.ExportToExcel(_dbaccess.GetAllData()), "Workbook", "Worksheet"); 

    return RedirectToAction("Index"); 
} 

どのように私は、このメソッドをテストすることができますか?

+1

このメソッドは、 'HttpContext'にあまりにも強く結合されています。テストするのは少し難しいが不可能ではない。どの方法をテストしたいですか? 'ExportToExcel'または' ExportData'です。どのようなテストフレームワークを使用していますか? – Nkosi

+0

理想的には最も重要なのは最も重要なのは 'ExportData'です – haddow64

+1

あなたはテストを正しく(意見に基づいて)正確に何をテストしたいのですか?私はアイデアを持っていますが、これらはあなたがテストするものの道を行く前に知っておく必要があるものです。 – Nkosi

答えて

1

まず、そのメソッドをリファクタリングして、もう少しテスト可能にする必要があります。テストを容易にするために、あまりにも多くの懸念が混在しています。 (私の意見)。同じクラスまたは実装は、あなたの元のメソッドを持っている正確にどのように見えることができますいくつかの依存関係

public interface IGetWorkBook { 
    XLWorkbook GetWorkBook(IEnumerable<dynamic> data, string sheetName); 
} 

に属することができ

ストリップアウトワークブック世代、。

public XLWorkbook GetWorkBook(IEnumerable<dynamic> data, string sheetName) {  
    XLWorkbook workbook = new XLWorkbook(); 
    var worksheet = workbook.Worksheets.Add(sheetName); 
    worksheet.Cell(1, 1).InsertTable(data);  
} 

あなたは彼がを嘲笑することが好きではありませんHttpContext

Don't mock HttpContextでテストを中心に得ることについていくつかの良い記事がある抽象化にHttpContext

への密結合を必要とする次の! :)

質問はwhat am I trying to achieve?です。この場合、ワークブックを何かに保存する必要があります。はい、この場合はHttpContextの応答ですが、それは別のものかもしれません。そのために我々はあなたが後でHttpContextあなたがそう使用するのが大好き派生クラスに含めることができる抽象

public interface IWriteWorkbook { 
    void Write(XLWorkbook workbook, string bookName); 
} 

を必要としています。

これも改善することができますが、それはこの記事の外にあります。

リファクタリングされたメソッドは、すべての変更の後にこのようになります。

public interface IExcelExporter { 
    void ExportToExcel(IEnumerable<dynamic> data, string bookName, string sheetName); 
} 

public class ExcelExport : IExcelExporter { 
    IGetWorkBook workbookgGetter; 
    IWriteWorkbook workbookWriter; 

    public ExcelExport (IGetWorkBook workbookgGetter,IWriteWorkbook workbookWriter) { 
     this.workbookgGetter = workbookgGetter; 
     this.workbookWriter = workbookWriter; 
    } 

    public void ExportToExcel(IEnumerable<dynamic> data, string bookName, string sheetName) 
    { 
     XLWorkbook workbook = workbookgGetter.GetWorkBook(data, sheetName); 
     void workbookWriter.Write(workbook,bookName);   
    }  
} 

よろしくお願いします。あなたはそれほどそうだったとは思わなかった?しかし、それは最終的にそれの価値がある。おもう? :)

コントローラをターゲットにする必要があります。

public class MyExcelController: Controller { 

    public MyExcelController(IExcelExporter exporter){ 
     ExcelExport = exporter; 
    } 

    IExcelExporter ExcelExport{get; private set;} 

    [ActionName("ExportData")] 
    public ActionResult ExportData() 
    { 
     ExcelExport.ExportToExcel(_dbaccess.GetAllData(), "Workbook", "Worksheet"); 

     return RedirectToAction("Index"); 
    } 
} 

元々のコントローラの動作が変更されていないことを確認してください。

今、私たちは心の中身を模擬してテストする準備が整いました。

あなたはIGetWorkBook.GetWorkBook

をテストすることができ、あなたが期待どおりにすべてが動作を確認するためにExcelExport.ExportToExcel

をテストすることができIWriteWorkbook.Write

をテストすることができます。

+0

うわー、それはいくつかの応答です、ありがとうございます。とても便利です。 – haddow64

2

おそらくメソッドを分割する必要があります。ファイルを表すバイト配列を生成し、バイト[]を返すメソッドの作成:

public static byte[] ExportToExcel(IEnumerable<dynamic> data, string bookName, string sheetName) 

をそして実際にディスクに保存されますメソッドを作成します。

public static bool SaveFileToDisk(byte[] file, string path) 

あなたはその後、ExportToExcelをテストすることができますメソッドを呼び出すと、既知のバイトが返されることをアサートします。

関連する問題