如何在模拟的HttpContextBase中设置返回会话和请求参数值?

时间:2017-09-22 15:27:37

标签: c# asp.net unit-testing moq

我正在尝试在 .ashx 中测试方法。 (是的,一个ASP.NET webform站点。)

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 =&gt; x.Params [&#34; PrintId&#34;]

但是,使用会话和请求参数值模拟HttpContext的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

如消息所示,该访问者不是虚拟的,因此无法覆盖/模拟测试。

NameValueCollection.Params属性为virtual,这意味着您可以将其替换为包含该密钥的实际NameValueCollection

var parameters = new NameValueCollection();
parameters.Add("PrintId", "1981");
moqRequest.Setup(x => x.Params).Returns(parameters);