2017-09-22 4 views
0

.ashxでメソッドをテストしようとしています。 (はい、ASP.NET Webフォームサイト。)虚偽のHttpContextBaseでリターンセッションとリクエストのparam値を設定するにはどうすればよいですか?

private Mock<HttpContextBase> moqContext; 
private Mock<HttpRequestBase> moqRequest; 
private Mock<HttpSessionStateBase> moqSession; 

[Test] 
public void ShouldDownloadFile() 
{ 
    moqContext = new Mock<HttpContextBase>(); 
    moqRequest = new Mock<HttpRequestBase>(); 
    moqSession = new Mock<HttpSessionStateBase>(); 

    moqRequest.Setup(x => x.Params["PrintId"]).Returns("1981"); 
    moqSession.Setup(x => x["VoucherId"]).Returns("164282"); 

    moqContext.Setup(x => x.Request).Returns(moqRequest.Object); 
    moqContext.SetupGet(x => x.Session).Returns(moqSession.Object); 

    var handler = new VoucherPrintServices(); 

    handler.DownloadReport(moqContext.Object); 
} 

テストが言って

moqRequest.Setup(x => x.Params["PrintId"]).Returns("1981"); 

で失敗した、非仮想(VBでオーバーライド)メンバーに

無効なセットアップ:x => x.Params ["PrintId"]

しかし、次に模擬する正しい方法はHttpContextですセッションとリクエストパラメータの値は?

+0

メッセージには、アクセサーは仮想ではないため、テストのためにオーバーライド/モックすることはできません。しかし、Paramsプロパティは仮想です。つまり、そのキーを含む実際のNameValueCollectionに置き換えることができます。 – Nkosi

+0

テスト中のメソッドでコンテキストがどのように使用されているかを示すと、助けになるはずです。そうすれば、私たちは何を嘲笑する必要があるのか​​を正確に知ることができます。なぜなら、1つのコンテキストモックだけしか必要とせず、そのすべてをセットアップするだけだからです。 – Nkosi

答えて

1

メッセージによれば、アクセサーは仮想ではないため、テストのためにオーバーライド/モックすることはできません。

ただしvirtualというプロパティは、そのキーを含む実際のNameValueCollectionと置き換えることができます。

var parameters = new NameValueCollection(); 
parameters.Add("PrintId", "1981"); 
moqRequest.Setup(x => x.Params).Returns(parameters); 
関連する問題