Причина, по которой вы получаете NullReferenceException
, заключается в том, что вы никогда не заглушали объект controller.Request
в своем модульном тесте и когда вы вызываете действие контроллера, которое использует Request.IsAjaxRequest()
, которое он выбрасывает.
Вот как можно смоделировать контекст, используя Rhino.Mocks
:
[TestMethod]
public void Test_Ajax()
{
// arrange
var sut = new HomeController();
var context = MockRepository.GenerateStub<HttpContextBase>();
var request = MockRepository.GenerateStub<HttpRequestBase>();
context.Stub(x => x.Request).Return(request);
// indicate AJAX request
request.Stub(x => x["X-Requested-With"]).Return("XMLHttpRequest");
sut.ControllerContext = new ControllerContext(context, new RouteData(), sut);
// act
var actual = sut.Index();
// assert
// TODO: ...
}
[TestMethod]
public void Test_Non_Ajax()
{
// arrange
var sut = new HomeController();
var context = MockRepository.GenerateStub<HttpContextBase>();
var request = MockRepository.GenerateStub<HttpRequestBase>();
context.Stub(x => x.Request).Return(request);
sut.ControllerContext = new ControllerContext(context, new RouteData(), sut);
// act
var actual = sut.Index();
// assert
// TODO: ...
}
А вот лучшая альтернатива (которую я лично рекомендовал бы вам), чтобы избежать всех действийкод.Используя MVCContrib.TestHelper (который основан на Rhino.Mocks
), ваш модульный тест можно упростить до следующего:
[TestClass]
public class HomeControllerTests : TestControllerBuilder
{
private HomeController _sut;
[TestInitialize()]
public void MyTestInitialize()
{
_sut = new HomeController();
this.InitializeController(_sut);
}
[TestMethod]
public void HomeController_Index_Ajax()
{
// arrange
_sut.Request.Stub(x => x["X-Requested-With"]).Return("XMLHttpRequest");
// act
var actual = _sut.Index();
// assert
// TODO: ...
}
[TestMethod]
public void HomeController_Index_Non_Ajax()
{
// act
var actual = _sut.Index();
// assert
// TODO: ...
}
}
Намного красивее.Это также позволяет писать гораздо более выразительные утверждения о результатах действий.Оформите документ или спросите, нужна ли вам дополнительная информация.