2011-12-31 3 views
2

ユニットテストとMVC 3での作業方法を学習しようとしていますが、2つのモデルをテストするにはどのように問題がありますか。ここでは、コード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()); 
} 
0

私はあなたのために非常に良い解決策を持っています。基本的に、それはまたあなたのための役に立つかもしれませんが、いくつかの他の機能を持っているもの@Jesseが既に提案したが、これら2つのポストであるに

Generic Repository Pattern - Entity Framework, ASP.NET MVC and Unit Testing Triangle

How to Work With Generic Repositories on ASP.NET MVC and Unit Testing Them By Mocking

:2つのブログの記事は、以下を参照してください。

関連する問題