【问题标题】:How to setup return session and request param values in a mocked HttpContextBase?如何在模拟的 HttpContextBase 中设置返回会话和请求参数值?
【发布时间】:2017-09-22 15:27:37
【问题描述】:

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

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 的正确方法是什么?

【问题讨论】:

  • 正如消息中所说,该访问器不是虚拟的,因此它不能被覆盖/模拟以进行测试。然而,Params 属性是虚拟的,这意味着您可以将其替换为包含该键的实际 NameValueCollection
  • 如果您展示了在被测方法中如何使用上下文,我会更容易提供帮助。这样我们就可以确切地知道需要嘲笑什么。因为您可能只需要一个上下文模拟并在其上设置所有内容。

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


【解决方案1】:

正如消息中所说,该访问器不是虚拟的,因此它不能被覆盖/模拟以进行测试。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 2011-09-12
    • 2016-07-05
    • 1970-01-01
    • 2021-10-09
    相关资源
    最近更新 更多