2010-12-04 4 views
1

ASP.NET MVC 2, NUnit, Moq 및 MVC Contrib를 사용하고 있습니다. 나는 처음으로 단원 시험을 썼고,이 시험과 관련하여 몇 가지 질문이 있습니다. 내 시나리오는 인덱스보기입니다. 이보기에는 모든 뉴스 항목을 표시하는 표가 있습니다. 시험 방법과NUnit 및 MVC로 첫 번째 테스트에서 포인터 필요

public interface INewsRepository 
{ 
    IEnumerable<News> FindAll(); 
} 

내 테스트 클래스 : 여기

내 INewsRepository 클래스입니다

public class NewsControllerTest :TestControllerBuilder 
{ 
    private Mock<INewsRepository> mockNewsRepository; 
    private NewsController newsController; 

    [SetUp] 
    public void Init() 
    { 
     mockNewsRepository = new Mock<INewsRepository>(); 
     newsController = new NewsController(mockNewsRepository.Object); 
     InitializeController(newsController); 
    } 

    [Test] 
    public void NewsController_Index() 
    { 
     // Arrange 
     var news = new Mock<IEnumerable<News>>(); 
     mockNewsRepository.Setup(r => r.FindAll()).Returns(news.Object).Verifiable(); 

     // Act 
     ActionResult actual = newsController.Index(); 

     // Assert 
     mockNewsRepository.Verify(); 
     actual 
     .AssertViewRendered() 
     .ForView("Index") 
     .WithViewData<News[]>() 
     .ShouldBe(news); 
    } 
} 

내보기 :

public ActionResult Index() 
{ 
    FakeNewsRepository fakeNewsRepository = new FakeNewsRepository(); 
    IEnumerable<News> news = fakeNewsRepository.FindAll(); 
    return View(news); 
} 

내가가는 길에 몇 가지 포인터를 필요로하는 나는 그것을했다. 나는 올바른 방향으로 가고 있는가? 무엇을 추가해야합니까, 무엇을 빠뜨리지 않으면됩니까? 단위 테스트를하고 싶습니다. 통합 테스트와 혼합합니까? 모든 추가 조언을 부탁드립니다. 내가 NUnit과 GUI 콘솔에서이 테스트를 실행하면

나는 다시 오류가 발생하고 I'mnot는 의미 있는지 무엇을 :

MyProject.Web.Tests.Controllers.NewsControllerTest.NewsController_Index: 
Moq.MockVerificationException : The following setups were not matched: 
INewsRepository r => r.FindAll() 

답변

3
public ActionResult Index() 
{ 
    FakeNewsRepository fakeNewsRepository = new FakeNewsRepository(); 
    IEnumerable<News> news = fakeNewsRepository.FindAll(); 
    return View(news); 
} 

당신은이 같은 하드 코드 저장소를 조롱 수 없습니다 당신의 행동. 당신은 행동 내부에서 그것을 인스턴스화하고 있습니다, 당신은 이것을 단위 테스트하고 저장소를 조롱 할 수 없을 것입니다. 저장소는 종속성으로 주입되어야합니다. 당신은 인터페이스를 사용하여 컨트롤러의 생성자에이 인터페이스를 전달할 수 :

public class HomeController: Controller 
{ 
    private readonly IRepository _repository; 
    public class HomeController(IRepository repository) 
    { 
     _repository = repository; 
    } 

    public ActionResult Index() 
    { 
     IEnumerable<News> news = _repository.FindAll(); 
     return View(news); 
    } 
} 

지금 당신의 단위 테스트 당신이 컨트롤러 생성자에 저장소의 조롱 인스턴스를 전달하고 기대를 정의 할 수 있습니다.

또한 MVCContrib.TestHelper은 Rhino Mocks와 작동하도록 설계되었습니다. Moq와 잘 작동하는지 잘 모르겠습니다.

+0

코드에는 _sut라는 컨트롤러에 대한 변수 이름이 있습니다. 왜 이것을 이걸라고 부릅니까? –

+0

테스트 중 제목. 이렇게하면 테스트 할 유형이 무엇인지 명확하게 알 수 있습니다. –

+0

컨트롤러를 테스트 할 때 댓글을 달 수있는 다른 것이 있습니까? 내가 한 시험에서 많이하고있는 건가? 너무 적습니까? 컨트롤러를 테스트 할 때 어떤 지침을 줄 수 있습니까? –

관련 문제