2

pdfファイルを返すコントローラーに対してテストケースを書いています。

コントローラーのコード:

  public FileStreamResult GeneratePdfReport(string context)
    {
        byte[] pdfReportContents = _helpPageBusinessService.GetHelpPagesAsPdf();
        Stream stream = new MemoryStream(pdfReportContents);
        HttpContext.Response.AddHeader("content-disposition", "attachment; filename=GSFA_Help_Pages_Printout.pdf");
        return new FileStreamResult(stream, "application/pdf");
    }

ユニットテストコード:

 [TestMethod]
    public void GeneratePdf()
    {
        var controller = new HelpController(_helpPageBusinessServiceReportServices, Logger);
        try
        {
            var result = controller.GeneratePdfReport("Work_Request_Section");
            Assert.IsNotNull(result);
            Assert.IsNotNull(result.FileStream);
        }
        finally
        {
            controller.Dispose();
        }
    }

この単体テストケースは機能しません。HttpContextがnullであるため、常に失敗します。

このタイプのコントローラーに対して単体テストケースを作成する方法を知っている人はいますか?

とても有難い !

ジェフリー

4

4 に答える 4

5

HttpContextと応答オブジェクトをモックする必要があります。また、コントローラーのアクションを少し短縮することもできます:

public ActionResult GeneratePdfReport(string context)
{
    byte[] pdfReportContents = _helpPageBusinessService.GetHelpPagesAsPdf();
    HttpContext.Response.AddHeader("content-disposition", "attachment; filename=GSFA_Help_Pages_Printout.pdf");
    return File(pdfReportContents, "application/pdf");
}
于 2010-11-02T22:37:28.020 に答える
3

Darin Dimitrov の推奨に従い、次のコードを思いつきました。:)

 [TestMethod]
    public void GeneratePdf()
    {
        var controller = new HelpController(_helpPageBusinessServiceReportServices, Logger);
        var httpContextBase = new Mock<HttpContextBase>
        {
            DefaultValue = DefaultValue.Mock
        };
        var responseObject = Mock.Get(httpContextBase.Object.Response);
        responseObject.Setup(
            s => s.AddHeader("content-disposition", "attachment; filename=GSFA_Help_Pages_Printout.pdf"));
        controller.ControllerContext = new ControllerContext(httpContextBase.Object, new RouteData(), controller);
        try
        {
            var result = controller.GeneratePdfReport("Work_Request_Section");
            Assert.IsNotNull(result);
            Assert.IsNotNull(result.FileStream);
            Assert.IsTrue(result.FileStream.Length == 2000);
        }
        finally
        {
            controller.Dispose();
        }
    }
于 2010-11-02T23:44:57.700 に答える
1

これは古典的なテストの問題です。これは、これが単体テスト (ファイル システムに触れる) というよりは統合テストであるという事実に由来します。

HTTP コンテキストのモックは、ASP.Net Web フォームの時代にさかのぼる主要な問題でした。おそらく、テストは HelpPageBusinessService に焦点を当てる必要があります。

他のすべてが失敗した場合は、おそらく依存性注入を介してヘルパー クラスをコントローラーに渡します。これにより、ヘッダーまたはモックがモック フレームワークに追加されます。

于 2010-11-02T22:45:03.563 に答える
0

MOQ を使用すると、ヘッダーが実際に応答オブジェクトに追加されているかどうかをテストすることもできます

var httpContextBase = new Mock<HttpContextBase>();
_httpResponse = new Mock<HttpResponseBase>();
httpContextBase.Setup(c => c.Response).Returns(_httpResponse.Object);
controller = new Controller(businessService.Object)
{
     ControllerContext = new ControllerContext { HttpContext = httpContextBase.Object }
};

その後、確認できます

_httpResponse.Verify(r => r.AddHeader("content-disposition", "attachment; filename=GSFA_Help_Pages_Printout.pdf"));
于 2011-06-17T15:47:44.760 に答える