2010-06-18 2 views
1

Я пытаюсь высмеять метод Ajax.IsRequest() ASP.Net MVC. Я узнал, как это сделать, чтобы оно вернулось:Mocking Ajax.IsRequest для возврата False

Expect.Call(_myController.Request.Headers["X-Requested-With"]).Return("XMLHttpRequest").Repeat.Any(); 

Это работает и возвращает true. Теперь мне нужно проверить другую ветвь кода. Как я могу издеваться над ним, чтобы вернуть false? Я попытался удалить макет в целом, он терпит неудачу с:

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); 
     } 


    } 

Любые советы? Cheers

+0

См. Http://stackoverflow.com/questions/2929058/newbie-question-on-mvccontrib-testhelpers – PatrickSteele

+0

Как я уже говорил, я могу заставить его высмеять его, чтобы вернуть true, что делает образцы кода в этом вопросе, но я не могу заставить его вернуть false. – Damien

+0

Не могли бы вы вставить весь тест, который работает? – Grzenio

ответ

7

Причина, по которой вы получаете 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: ... 
    } 
} 

Гораздо симпатичнее. Это также позволяет вам писать гораздо более выразительные утверждения о результатах действий. Оформить заказ документа или спросить, нужна ли дополнительная информация.

+0

Cheers. Попробуем это (и эта структура, похоже, облегчит мою жизнь. Будет комментировать в ближайшее время. До тех пор еще раз спасибо! – Damien

1
Expect.Call(_myController.Request.Headers["X-Requested-With"]).Return("SpitAndDuctTape").Repeat.Any(); 

... должен выполнить эту работу.

+0

Ошибка в качестве Request.Headers имеет значение null. Возможно, это тоже будет издеваться над этим. – Damien

+0

Вы делаете это * точно *, как вы делаете это для «истинного» случая, но меняете только одну строку. Собственно, только эта строка. Если код, который вы даете, работает для «истины», как вы утверждаете, тогда должен быть добавлен дополнительный код, который вы не показываете. Используйте этот же код для этого случая. –

Смежные вопросы