单元测试:创建模拟MVC页面请求的“模拟”请求

时间:2008-11-26 17:45:27

标签: asp.net-mvc unit-testing tdd

如何为我的asp.net-mvc应用程序创建模拟请求以进行单元测试?

我有哪些选择?

我在我的动作中使用FormsCollection,所以我也可以模拟表单输入数据。

1 个答案:

答案 0 :(得分:4)

您只需要创建一个FormCollection的新实例并在其中添加数据。

所以你可以在不嘲笑任何东西的情况下调用这样的东西。

var result = controller.Create(new FormCollection { { "InvoiceId", "-1" } }) as RedirectToRouteResult;

否则,如果您的代码调用Request或HttpContext之类的东西,您可以使用以下扩展方法(灵感来自Scott Hanselman的example

我正在使用RhinoMocks。

public static HttpContextBase SetHttpContext(this MockRepository mocks, Controller controller, HttpCookieCollection cookies) {
cookies = cookies ?? new HttpCookieCollection();

var request = mocks.StrictMock<HttpRequestBase>();
var context = mocks.StrictMock<HttpContextBase>();
var response = mocks.StrictMock<HttpResponseBase>();

SetupResult.For(context.Request).Return(request);
SetupResult.For(context.Response).Return(response);
SetupResult.For(request.Cookies).Return(cookies);
SetupResult.For(request.IsSecureConnection).Return(false);
SetupResult.For(response.Cookies).Return(cookies);

if (controller != null)
{
    controller.ControllerContext = new ControllerContext(context, new RouteData(), controller);
}

if (!string.IsNullOrEmpty(requestUrl))
{
    request.SetupRequestUrl(requestUrl);
    SetupResult.For(response.ApplyAppPathModifier(null)).IgnoreArguments().Return(null);
}

return context;
}