Дразнящий Ajax.IsRequest, чтобы вернуть False - PullRequest
1 голос
/ 18 июня 2010

Я пытаюсь смоделировать метод 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 ]

7 голосов
/ 21 июня 2010

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

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

1 голос
/ 18 июня 2010
Expect.Call(_myController.Request.Headers["X-Requested-With"]).Return("SpitAndDuctTape").Repeat.Any();

... должен сделать работу.

...