2010-07-07 3 views
2

Вчера я переустановил метод ниже, чтобы вернуть либо полный просмотр, либо частичный вид.Mocking and Stubbing Ajax Requests

public ActionResult List(int page) 
{ 
    var viewModel = GetListViewModel(page); 

    if(Request.IsAjaxRequest()) 
    { 
     return PartialView("_list", viewModel); 
    } 
    return View("PartsList", viewModel); 
} 

Но теперь мои тесты разбиты, они терпят неудачу на if заявлении. Я сделал Google и нашел, вы можете издеваться/окурок на HTTP запросы с чем-то вроде,

HttpContextBase mockedContext = MockRepository.GeneratePartialMock<HttpRequestBase>(); 
HttpRequestBase mockedContext = MockRepository.GeneratePartialMock<HttpContextBase>(); 

mockedContext.Stub(x => x.Request).Return(mockedRequest); 
mockedRequest.Stub(r => r["X-Requested-With"]).Return(""); 

subject.ControllerContext = new ControllerContext { HttpContext = mockedContext }; 

Я реализовал выше в моем тесте, и это все еще упасть.

TEST

public class when_asked_for_the_parts_list_view : context_for_part_controller 
{ 
    static ActionResult _result; 
    static IPagination<Part> _parts; 
    static PartListPageViewModel _partListPageViewModel; 

    Establish context =() => 
    { 
     mockedContext.Stub(x => x.Request).Return(mockedRequest); 
     mockedRequest.Stub(r => r["X-Requested-With"]).Return("XMLHttpRequest"); 
     subject.ControllerContext = new ControllerContext { HttpContext = mockedContext }; 

     _parts = new List<Part>().AsPagination(1); 
     _partListPageViewModel = new PartListPageViewModel(); 

     _partTasks.Stub(x => x.GetParts(1)).Return(_parts); 
     _listMapper.Stub(x => x.MapFrom(_parts)).Return(_partListPageViewModel); 
    }; 

    Because of =() => 
    { 
     _result = subject.List(1); 
    }; 

    It should_retreve_the_parts = 
     () => _partTasks.AssertWasCalled(x=>x.GetParts(1)); 

    It should_map_the_parts_to_a_viewModel = 
     () => _listMapper.AssertWasCalled(x => x.MapFrom(_parts)); 

    It should_return_the_list_as_a_partialview = 
     () => _result.ShouldBeAPartialView().ViewData.Model.ShouldEqual(_partListPageViewModel); 
} 

ОШИБКА

should map the parts to a viewModel : Failed 
The method or operation is not implemented. 

System.NotImplementedException: The method or operation is not implemented. 

at System.Web.HttpRequestBase.get_Headers() 
at HttpRequestBaseProxy5a253d42dd57477f936e24736e848cbb.get_Headers_callback_47() 
at HttpRequestBaseProxy5a253d42dd57477f936e24736e848cbb.Invocationget_Headers_66.InvokeMethodOnTarget() 
at Castle.DynamicProxy.AbstractInvocation.Proceed() 
at Rhino.Mocks.Impl.ReplayPartialMockState.DoMethodCall(IInvocation invocation, MethodInfo method, Object[] args) 
at Rhino.Mocks.Impl.ReplayMockState.MethodCall(IInvocation invocation, MethodInfo method, Object[] args) 
at Rhino.Mocks.MockRepository.MethodCall(IInvocation invocation, Object proxy, MethodInfo method, Object[] args) 
at Rhino.Mocks.Impl.RhinoInterceptor.Intercept(IInvocation invocation) 
at Castle.DynamicProxy.AbstractInvocation.Proceed() 
at HttpRequestBaseProxy5a253d42dd57477f936e24736e848cbb.get_Headers() 
at System.Web.Mvc.AjaxRequestExtensions.IsAjaxRequest(HttpRequestBase request) 
at Catalogue.Web.Controllers.Part.PartController.List(Int32 page) in PartController.cs: line 143 
at Catalogue.MSpecTests.UI.Parts.when_asked_for_the_parts_list_view.<.ctor>b__6() in PartControllerTests.cs: line 214 

Как получить запрос в Request.IsAjaxRequest() в мой контроллер, чтобы передать как AJAX запроса ???

С уважением Rich

Редактировать - Найдено this пост, мой Аякс тест сейчас проходит, но мой не-Аякс до сих пор не удается.

ответ

1

Вы должны, вероятно, создать интерфейс, как это, который легко реализовать и макет:

public interface IRequestInfo 
{ 
    bool IsAjaxRequest { get; } 
} 

Тогда ваш класс может выглядеть следующим образом:

public class MyClass 
{ 
    private readonly IRequestInfo _request; 

    public MyClass(IRequestInfo request) 
    { 
     _request = request; 
    } 

    public ActionResult List(int page) 
    { 
     var viewModel = GetListViewModel(page); 
     if (_request.IsAjaxRequest) 
     { 
      return PartialView("_list", viewModel); 
     } 
     return View("PartsList", viewModel); 
    } 
} 

И тесты становится:

[Test] 
public void List_returns_PartialView_for_Ajax_request() 
{ 
    // arrange system under test and stubs 
    var request = MockRepository.GenerateStub<IRequestInfo>(); 
    request.Stub(x => x.IsAjaxRequest).Returns(true); 
    var myObject = new MyClass(request); 

    // act 
    object result = myObject.List(0); 

    // assert 
    Assert.IsTrue(result is PartialView); 
} 

Обратите внимание, что ваш тест больше не связан с заголовками HTTP. Это внутренняя проблема реализации IRequestInfo. И так как эта реализация будет просто тонкой оболочкой вокруг объекта ASP.NET HttpContext.Request, нет необходимости в ее тестировании.

+0

Работал сон, не думал об этом так. Думаю, для этого нужны свежая пара глаз. –

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