2010-07-07 2 views
2

어제 전체보기 또는 부분보기를 반환하기 위해 어제 아래 메소드를 다시 작성했습니다.Ajax 요청 조롱 및 스텁

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

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

하지만 이제 내 테스트가 실패했습니다. 그들은 if 문을 사용하지 못했습니다. 나는

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

나는 내 테스트에서 위를 구현하고 여전히 이상 떨어지고, 구글을 수행하고/당신이 조롱 수 있습니다 발견 같은과 HTTP 요청을 스텁했습니다.

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

ERROR

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()의 요청이 아약스 요청으로 전달받을 수 있나요 ???

감사 리치

편집 - 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

꿈을 이루었습니다. 그런 식으로 생각하지 않았습니다. 나는 새로운 쌍의 눈이 필요하다고 생각한다. –