我测试控制器有困难。用于测试的原始控制器如下所示:
SomethingController CreateSomethingController()
{
var somethingData = FakeSomethingData.CreateFakeData();
var fakeRepository = FakeRepository.Create();
var controller = new SomethingController(fakeRepository);
return controller;
}
在我拿到证书之前,这在大多数测试中都很有效
Request.IsAjaxRequest()
代码的一部分。所以我不得不模拟HttpContext和HttpRequestBase。所以我的代码变成了:
public class FakeHttpContext : HttpContextBase
{
bool _isAjaxRequest;
public FakeHttpContext( bool isAjaxRequest = false )
{
_isAjaxRequest = isAjaxRequest;
}
public override HttpRequestBase Request
{
get
{
string ajaxRequestHeader = "";
if ( _isAjaxRequest )
ajaxRequestHeader = "XMLHttpRequest";
var request = new Mock<HttpRequestBase>();
request.SetupGet( x => x.Headers ).Returns( new WebHeaderCollection
{
{"X-Requested-With", ajaxRequestHeader}
} );
request.SetupGet( x => x["X-Requested-With"] ).Returns( ajaxRequestHeader );
return request.Object;
}
}
private IPrincipal _user;
public override IPrincipal User
{
get
{
if ( _user == null )
{
_user = new FakePrincipal();
}
return _user;
}
set
{
_user = value;
}
}
}
SomethingController CreateSomethingController()
{
var somethingData = FakeSomethingData.CreateFakeData();
var fakeRepository = FakeRepository.Create();
var controller = new SomethingController(fakeRepository);
ControllerContext controllerContext = new ControllerContext( new FakeHttpContext( isAjaxRequest ), new RouteData(), controller );
controller.ControllerContext = controllerContext;
return controller;
}
Url.Route
和
Url
为空。所以看起来我需要开始模拟我的控制器的路由。
我似乎花了更多的时间在google上搜索如何伪造/模拟对象,然后调试以确保我的伪造是正确的,而不是实际编写测试代码。有没有更简单的方法来测试控制器?我已经看过了MvcContrib的TestControllerBuilder,它有助于解决一些问题,但似乎并不是万能的。还有什么可以做的工作,让我集中精力写测试,而不是写模拟?
谢谢