2010-07-15 5 views
1

Nunit, Ninject, MVC2 및 ADO.Net 엔터티 데이터 모델을 사용하여 머리를 쓰려고합니다.Nunit, Ninject, MVC2 및 ADO.Net 엔터티 데이터 모델로 단위 테스트

SqlProductsRepository 클래스를 인스턴스화하는 ProductsController가 있다고 가정 해 보겠습니다.

public class ProductsRepository : IProductsRepository 
{ 
    public MyDbEntities _context; 

    public ProductsRepository() 
    { 
     _context = new MyDbEntities(); 
    } 

    public IList<Product> GetAllProducts() 
    { 
     return (from p in _context.Products select p).ToList(); 
    } 
} 

public class ProductsController : Controller 
{ 
    public ActionResult ProductsList() 
    { 
     ProductsRepository r = new ProductsRepository(); 
     var products = r.GetAllProducts(); 

     return View(products); 
    } 
} 

나는 이것이 올바른 데이터를 반환하지만 난 테스트 클래스를 작성하는 방법을 잘 모르겠어요 보장하기 위해 ProductsRepository에 단위 테스트를 수행 할 수 있도록하고 싶습니다.

내가 읽은 모든 튜토리얼/문서는 IProductsRepository를 사용하여 모의 객체를 만든 다음 컨트롤러를 주입하고 테스트하는 것을 가리킨다.

이것은 나에게 구체적인 구현을 우회하는 것처럼 보입니다.

MyDbEntities은 오는 ADO.Net 엔터티 데이터 모델 .edmx

답변

3

같은 명백한 일을 할 것입니다. 그것이 요점입니다.

단위 테스트는 기능 테스트와 같은 것은 아닙니다. 모의 객체는 명시 적으로 정의한 것을 반환하도록 설정 한 다음 상수 입력이 모의 결과에서 의 결과를 얻는 지 확인하기 위해 테스트합니다.

+0

좋아, 나와 함께있다. 제 의도는 저장소 메서드 자체를 테스트하기 위해 컨텍스트를 바꾸기 위해 db 표현을 주입하는 것이 었습니다. 이것이 좋은 일이 아니겠습니까? –

+0

그걸 할 수는 있겠지만 그건 정말로 조롱하는 것입니다. 아이디어는 비즈니스 로직 코드의 각 주요 경로에 대해 적용 범위를 갖고 싶어하므로 각 테스트에서 모의 ​​테스트를 실시하여 해당 경로를 테스트하는 결과를 반환해야합니다. 이것은 당신의 시험을 작고 단단하게 할 것입니다. –

+0

건배. 나는 사용 된 용어가 섞여 있다고 생각한다. 저장소를 테스트하기 위해 Mock을 만드는 방법은 무엇입니까? –

2
오히려 단위 테스트보다 ProductsRepository에 대한 통합 테스트를 작성하고자하는 것처럼 그렇게 데이터베이스에 대해 테스트 할 것입니다 이후, 사운드

올바른 데이터를 제공하는지 확인할 수 있습니다.

제품 레포지토리를 모의하려는 컨트롤러를 테스트하는 단위입니다. ProductsRepository 내 통합 테스트에서

, 나는 당신이 정확히 오른쪽 저장소를 조롱하고 구체적인 구현을 우회 않습니다

public void TestProductsRepository() 
{ 
    var context = new MyDbEntities(); 

    // add a new product 

    var products = context.GetAllProducts(); 

    // check products contains new product 
} 
+0

I는 다음과 같은 저장소의 더 복잡한 방법을 테스트하고 싶습니다. 나는 이것이 유효한 단위 테스트 일 것이라고 생각했다. –

+0

확실히 테스트할만한 것이지만, 결과를 얻기 위해 리포지토리가 Entity Framework와 통합되어야하기 때문에 단위 테스트로 설명하지는 않을 것입니다. –

+0

당신은 여전히 ​​이것을 위해 nunit을 사용하겠습니까? –

2

두 클래스 (ProductsRepository, ProductsController)로 두 세트의 테스트가 있어야합니다. 각 클래스에 대해 한 세트의 테스트.

(단위) ProductsController를 테스트 할 때 종속성을 조롱해야합니다 (이 경우 IProductsRepository). 의존성의 구체적인 구현을 우회하는 것이 핵심이다.

ProductsRepository가 데이터베이스에 도달하여 올바른 데이터를 리턴 할 수 있는지를 검증하는 완전히 다른 통합 테스트 세트가 있습니다. 이 통합 테스트에서 여러분은 테스트중인 것이 실제 리포지토리와 실제 데이터베이스 간의 상호 작용이므로 아무 것도 모방하지 않을 것입니다. 이 올바른 데이터를 반환 보장하기 위해 GetProductByBrandNameAndProductTypeAndProductName (문자열 한 brandname, 문자열 productTypeSysName, 문자열 PRODUCTNAME) :