2011-12-31 3 views
2

단위 테스트 및 MVC 3 작업 방법을 배우려고하고 있는데 두 모델을 테스트하는 방법에 문제가 있습니다. 여기에 코드TDD 및 MVC 3, 테스트 모델

public class HomeController : Controller 
{ 
    private IRepository _repository; 

    public HomeController(IRepository repository) 
    { 
     _repository = repository; 
    } 

    // 
    // GET: /Home/ 

    public ActionResult Index() 
    { 
     return View(_repository.GetAllGenres()); 
    }  
} 

public interface IRepository 
{ 
    IEnumerable<Genre> GetAllGenres(); 
    IEnumerable<Album> GetTopAlbums(int count); 
} 

이며, 이제 내 질문에 내가 일을 원하는 같은 것을 만들어 가야합니까 어떻게 정확하게이 내 단위 테스트

[TestFixture] 
class HomeControllerTests 
{ 
    [Test] 
    public void Test1() 
    {     
     //Arrange 
     var controller = new HomeController(new InMemoryRepository()); 
     var result = (ViewResult) controller.Index(); 

     Assert.AreEqual(10,((IEnumerable<Genre>)result.ViewData.Model).Count()); 
    } 

    [Test] 
    public void Test2() 
    { 
     var controller = new HomeController(new InMemoryRepository()); 
     var result = (ViewResult) controller.Index(); 
     //I Want to be able to do something like this 
     Assert.AreEqual(5,result.ViewData.Model.GetTopAlbums(5).Count); 
    } 
} 

가정. 또는 Top Albums를 반환하는 ChildActionOnly 메서드를 만듭니다.

답변

2

시험을 돕기 위해 조롱 프레임 워크를 사용 해본 적이 있습니까? 예를 들어 GetTopAlbums 통화에서 모의를 사용할 수 있습니다. 내 선호도는 moq이지만 선택할 수있는 몇 가지 좋은 조롱 프레임 워크가 있습니다.

참고, 이것은 매우 간단한 예이지만, 당신은 쉽게 앨범의 당신의 예상 번호 목록을 생성하는 테스트 헬퍼를 만들 수 있습니다

[Test] 
public void Index_Get_Should_Lookup_Top_Albums_And_Return_Index_View() 
{ 
    // arrange 
    var expectModel = new List<Album> 
          { 
           new Album{Artist= "joe", Tracks = 16}, 
           new Album{Artist= "doe", Tracks = 23}, 
          }; 

    _repository.Setup(x => x.GetTopContacts(It.IsAny<int>())).Returns(expectModel); 

    var controller = new HomeController(_repository.Object); 

    // act 
    var result = controller.TopContacts(); 
    var model = result.ViewData.Model as IEnumerable<Album>; 

    // assert 
    Assert.AreEqual(2, model.Count()); 
}