2009-09-04 2 views
1

목록 및 만들기 만 사용하는 매우 간단한 폼을 테스트하려고합니다. 이것은 컨트롤러 :모든 요청시 컨트롤러 생성자가 호출되었습니다.

public class PositionsController : Controller 
{ 
    private readonly IPositionRepository _positions; 

    // default constructor 
    public PositionsController() 
    { 
     _positions = new TestPositionRepository(); 
    } 

    // DI constructor 
    public PositionsController(IPositionRepository positions) 
    { 
     _positions = positions; 
    } 

    // get a list of all positions 
    public ActionResult Index() 
    { 
     return View(_positions.GetAllPositions()); 
    } 

    // get initial create view 
    public ActionResult Create() 
    { 
     return View(); 
    } 

    // add the new Position to the list 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(Position positionToAdd) 
    { 
     try 
     { 
      _positions.AddPosition(positionToAdd); 

      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(); 
     } 
    } 
} 

TestPositionRepository 단순히 내가 의존성 주입을 테스트하기 위해 만든 모의 저장소입니다. 새 항목을 만들려고 할 때마다 인덱스보기로 다시 보내지 만 새 항목은 목록에 추가되지 않습니다. 디버거를 사용하면 링크를 클릭하거나 컨트롤러의 컨트롤 내에서 링크를 탐색 할 때마다 생성자가 호출된다는 것을 알 수 있습니다. 이 문제를 해결할 방법이 있습니까? 나는 잘못하고 있다고 느낍니다. 내가 뭘하려고하는지 의존성 주입을 사용하여 Ninject하지만 난 지금 까지이 문제에 붙어 있어요.

답변

1

MockRepository는 대부분의 경우 상태 비 저장됩니다. 인덱스에 추가 된 항목이 표시되지 않는 이유가 여기 있습니다. 나는 인덱스와 Create를 개별적으로 테스트 할 것이다. 인덱스의 경우 기존 항목이 올바르게 표시되는지 만 확인합니다. 즉, MockRepository에는 GetPositions - Method에 대해 기존 엔트리가 하드 코딩되어 있어야합니다.

응용 프로그램을 통해 흐름을 테스트하려면 (Create + Index는 무엇인가) 실제 저장소에서 통합 테스트를 사용합니다.

+0

모의 저장소의 상태를 정적 클래스로 유지할 방법이 없습니까? 먼저 데이터 클래스를 개발하고 모든 것이 작동하는지 확인한 다음 모델을 사용하여 데이터베이스 테이블을 디자인하려고합니다. 내 생각에 주위에 테이블을 변경하는 것보다 클래스를 변경하는 것이 더 쉽고 모의 리포지토리가 작동하면 ORM을 만들어 클래스에 묶는 것뿐입니다. –

+0

Mock 유지 상태를 만드는 방법이 있습니다. 그러나 그것은 나에게 좋은 길로 보이지 않습니다. 객체 그래프의 게으른 로딩 및 참조가있는 객체의 삭제와 같이 고려해야 할 ORM의 중요하지 않은 측면에 대해 생각해보십시오. 페이지 플로우를 테스트하려는 경우 모의는이 시나리오에서 실제 저장소처럼 작동해야합니다. TDD를 할 때 모의 저장소를위한 장소가 분명히 있지만, 어플 리케이션을 사용할 때 애플리케이션의 작은 부분을 고수해야합니다. –

9

왜 이것이 문제입니까 - ASP.NET 요청이 작동하는 이유입니다. 각 요청은 asp.net 페이지 또는 MVC 컨트롤러의 자체 인스턴스를 실행하고 요청이 완료되면 컨트롤러가 삭제되고 요청간에 이러한 작업이 수행되지 않습니다.

따라서 create 메소드에서 새 위치를 추가 한 후에 저장소의 save/commit 메소드를 호출해야합니다.

+1

아, 나는 그것을 몰랐다. 저는 컨트롤러가 세션 당 한 번만 인스턴스화되었다고 생각했습니다. 모의 저장소는 하드 코딩 된 항목이 들어있는'List'입니다. 'AddPosition' 메쏘드는 잘 작동 할 것입니다. 그러나 컨트롤러의 생성자가 새로 고침 할 때마다 호출되기 때문에 매번 새로운'List'를 인스턴스화합니다. –

+1

두려워하지 않는 컨트롤러는 WebForms 페이지처럼 작동합니다. 조롱 목적으로 모의 내용을 정적 클래스에 넣을 수 있습니다. 실제 저장소에 대해 테스트하지는 않을 것입니다. 그런 종류의 테스트는 유닛 테스트와 반대되는 것입니다. – blowdart