Дразнящий Ajax.IsRequest, чтобы вернуть False
Я пытаюсь издеваться над методом Ajax.IsRequest() ASP.Net MVC. Я узнал, как это сделать, чтобы он вернул true:
Expect.Call(_myController.Request.Headers["X-Requested-With"]).Return("XMLHttpRequest").Repeat.Any();
Это работает и возвращает истину. Теперь мне нужно протестировать другую ветку кода. Как я могу издеваться, чтобы вернуть ложь? Я попытался удалить макет, это не удается с:
System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта.]
Если я сделаю:
Expect.Call(_templateReportController.Request["X-Requested-With"]).Return(null).Repeat.Any();
Это терпит неудачу с той же самой ошибкой.
Весь тест:
/// <summary>
/// Tests the Edit Action when calling via Ajax
/// </summary>
[Test]
public void Test_Edit_AjaxRequest()
{
Group group = new Group();
group.ID = 1;
group.Name = "Admin";
IList<Group> groupList = new List<Group>() { group };
Definition def = new Definition();
def.ID = 1;
def.Name = "Report";
def.LastModified = DateTime.UtcNow;
def.Groups.Add(group);
using (_mocks.Record())
{
Expect.Call(_myController.Request["X-Requested-With"]).Return("XMLHttpRequest").Repeat.Any();
Expect.Call(_DefBiz.GetAll<Group>()).Return(groupList);
Expect.Call(_DefBiz.Get<Definition>(1)).Return(def);
}
myController.DefAccess = _DefBiz;
PartialViewResult actual;
using (_mocks.Playback())
{
actual = (PartialViewResult)myController.Edit(1);
}
}
Любые советы? ура
2 ответа
Причина, по которой вы получаете 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: ...
}
}
Намного красивее Это также позволяет писать гораздо более выразительные утверждения о результатах действий. Оформите документ или спросите, нужна ли вам дополнительная информация.
Expect.Call(_myController.Request.Headers["X-Requested-With"]).Return("SpitAndDuctTape").Repeat.Any();
... должен сделать работу.