2011-12-31 34 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); 
    } 
} 

現在的問題是究竟如何去讓像我想要的工作。或者我創建一個負責返回熱門專輯的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()); 
}