如何为我的asp.net-mvc应用程序创建模拟请求以进行单元测试?
我有哪些选择?
我在我的动作中使用FormsCollection,所以我也可以模拟表单输入数据。
答案 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;
}