我正在尝试在 .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 => x.params [" printid"]
但是,使用会话和请求参数值模拟HttpContext
的正确方法是什么?
正如消息所说的那样,该访问者不是虚拟的,因此不能被覆盖/模拟测试。
NameValueCollection.Params
属性是virtual
,这意味着您可以用包含该密钥的实际NameValueCollection
替换它。
var parameters = new NameValueCollection();
parameters.Add("PrintId", "1981");
moqRequest.Setup(x => x.Params).Returns(parameters);