如何在单元测试asp.net mvc应用程序中模拟Request对象

时间:2013-12-04 14:25:54

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

我正在开发一个asp.net mvc 3.0应用程序。在单元测试我的控制器中的一个动作方法时,我收到了一个错误。

如何模拟:Request.Params["FieldName"]

我已经包含了Moq框架,但不确定如何传递值

这是我的代码......请建议......

 var request = new Mock<System.Web.HttpRequestBase>();

 request
     .SetupGet(x => x.Headers)
     .Returns(
         new System.Net.WebHeaderCollection
         {
             {"X-Requested-With", "XMLHttpRequest"}
         });

 var context = new Mock<System.Web.HttpContextBase>();

 context.SetupGet(x => x.Request).Returns(request.Object);

 ValidCodeController target = new ValidCodeController();

 target.ControllerContext =
     new ControllerContext(context.Object, new RouteData(), target);

2 个答案:

答案 0 :(得分:11)

ParamsNameValueCollection属性,可以与Headers类似的方式进行设置:

var requestParams = new NameValueCollection
{
    { "FieldName", "value"}
};

request.SetupGet(x => x.Params).Returns(requestParams);

答案 1 :(得分:0)

模拟Context及其所有依赖项的另一种方法是在一个单独的类中抽象整个context / Params集合,然后模拟它。在许多情况下,这将使其更容易,并避免必须模拟复杂的对象图:

例如:

public void MainMethod()
{
   var valueInQuestion = ISomeAbstraction.GetMyValue("FieldName");

}

您现在可以模拟GetMyValue方法。