2010-06-17 6 views
6

Customer의 개체를 검색하는 데 사용되는 ICustomerRepository 인터페이스를 단위 테스트하고 있습니다.인터페이스 저장소 단위 테스트의 목적은 무엇입니까

  • 단위 테스트로 어떤 방식으로이 값을 ICustomerRepository을 통해 테스트 할 수 있습니까?
  • 어떤 조건에서 아래 테스트가 실패합니까?
  • 이런 성격의 테스트를 위해 내가 실패해야하는 테스트를 수행하는 것이 좋습니다. 나는 단지 내가 아마 뭔가를 분명 잃었지만 더 가치가있을 것입니다 ICustomerRepository를 구현하는 클래스의 통합 테스트를 보인다 저장소

5을 배치 한 알고 ID 4을 찾아 즉.

[TestClass] 
public class CustomerTests : TestClassBase 
{ 
    private Customer SetUpCustomerForRepository() 
    { 
     return new Customer() 
     { 
      CustId = 5, 
      DifId = "55", 
      CustLookupName = "The Dude", 
      LoginList = new[] 
      { 
       new Login { LoginCustId = 5, LoginName = "tdude" }, 
       new Login { LoginCustId = 5, LoginName = "tdude2" } 
      } 
     }; 
    } 

    [TestMethod] 
    public void CanGetCustomerById() 
    { 
     // arrange 
     var customer = SetUpCustomerForRepository(); 
     var repository = Stub<ICustomerRepository>(); 

     // act 
     repository.Stub(rep => rep.GetById(5)).Return(customer); 

     // assert 
     Assert.AreEqual(customer, repository.GetById(5)); 
    } 
} 

시험 기본 클래스

public class TestClassBase 
{ 
    protected T Stub<T>() where T : class 
    { 
     return MockRepository.GenerateStub<T>(); 
    } 
} 

ICustomerRepository 및 IRepository

public interface ICustomerRepository : IRepository<Customer> 
{ 
    IList<Customer> FindCustomers(string q); 
    Customer GetCustomerByDifID(string difId); 
    Customer GetCustomerByLogin(string loginName); 
} 

public interface IRepository<T> 
{ 
    void Save(T entity); 
    void Save(List<T> entity); 
    bool Save(T entity, out string message); 
    void Delete(T entity); 
    T GetById(int id); 
    ICollection<T> FindAll(); 
} 

답변

5

규칙 # 테스트 1 :

당신이 그것을 쓰기 전에 증명하려고 무엇 테스트의 목적이며 뭔지 알아. 그것이 무엇인지 증명하지 못하면 쓸모가 없습니다.

다른 포스터에서 올바르게 말한대로 인터페이스를 스터 빙하고 스텁을 호출합니다. 코드가 작동합니다.

스텁이란 무엇입니까?

스텁은 테스트중인 클래스의 일부 측면을 구동하기 위해 준비 값을 제공하는 데 사용됩니다. 예 : ICustomerRepository 유형의 인스턴스가있는 CustomerService이 있다고 가정 해보십시오. CustomerService이 저장소가 비어있을 때 오류 케이스를 정상적으로 처리하기를 원한다면 ICustomerRepositoryGetCustomerById 메소드를 반환하여 아무것도 반환하지 않거나 null을 throw하거나 예외를 throw 한 다음 CustomerService 메서드가 올바른 작업을 수행했는지 확인하십시오. 예를 들어 고객이 찾을 수없는 결과를 반환).

e.e. 스텁은 특정 조건/관심 행동에 도달하는 데 도움이되는 공동 작업자입니다. 우리는 CustomerService을 테스트하고 스터브 된 ICustomerRepository은 우리의 목표를 달성하는 데 도움이됩니다.

당신은이 질문에 가장 먼저 질문하지 않습니다. :) 나는 보통 개발자에게 hand-roll their test doubles at first라고 조언합니다. 모든 상호 작용과 프레임 워크가 실제로 무엇을하는지 이해하는 데 도움이됩니다.

4

인터페이스, 정의, 단지 계약, 그래서 테스트 할 코드가 없습니다. 인터페이스의 구체적인 구현 (들)에 대한 단위 테스트를 작성하고 싶습니다. 실제 테스트 코드가있는 곳이기 때문입니다.

인터페이스 구현이 구체적이지 않고 구체적인 구현을 조롱하는 경우 유닛 테스트는 모의만을 기반으로합니다. 그건별로 가치가 없다.

6

내가 누락되었을 수 있지만 테스트의 모든 측면이 조롱을당한 것처럼 보입니까?

일반적으로 말해서 테스트에 핵심이 아닌 객체 만 모의합니다. 이 경우 저장소를 사용하여 고객 # 5를 검색하고 작업을 수행 할 것으로 예상되는 기능의 소스로이 저장소를 사용할 수 있습니다.

예를 들어 고객 저장소를 조롱하여 사용자의 로그인을 확인하는 방법을 호출 할 수 있습니다. 모의 저장소를 사용하여 유닛 테스트가 모의 저장소가 아닌 실제 데이터 소스에 의존하지 않도록 할 수 있습니다.

2

테스트가 나에게 적합하지 않습니다. 미리 프로그래밍 된 스텁에서 값을 반환하는 경우 테스트를 수행하고 있으며 실제 코드를 테스트하지는 않습니다.

dcp 님의 회신을 따르십시오. 인터페이스는 메소드의 선언입니다. 이 구현을 테스트해야합니다.

+0

어떻게? 내가 읽은 곳이라면 단위 테스트를위한 인터페이스를 조롱하는 법을 배웁니다. 우리는 어떻게 구체적인 구현을 단위 테스트합니까? 나는 그것이 내 이해에 피해야한다고 생각했다. 예를 들어 주시겠습니까? 고맙습니다! – Stack0verflow

+1

인터페이스는 실행할 수 있고 따라서 테스트 할 수있는 코드가 아닌 명세이며 선언입니다. 이 스펙을 구체적인 클래스로 구현하면 실행하고 테스트 할 코드가됩니다. 모의 객체를 사용하여 인터페이스를 구현할 수 있습니다.이 인터페이스를 구현하는 객체에 의존하는 * 다른 * 코드를 테스트하는 데 도움이됩니다. 당신은 "인터페이스 테스트"를하지 않고, 해당 구현의 인터페이스 메소드 ("인터페이스에 대한 테스트")를 호출하여 해당 인터페이스의 구현이 올바른지 테스트합니다. –

+1

어리석은 예 : '먹는 (dog)'에 의해 구현되고 '먹이 (먹는 동물)'방법에서 '마스터'에 의해 호출되는 것들에 대한'먹는 (Eater) '인터페이스. 'Dog'를 테스트 할 때, 당신은 dog 인스턴스에서'eat'을 호출하여'Eater' 인터페이스의 구현을 테스트 할 것입니다. 개가 체중을 얻는다는 것. 'Master '의'feed()'메소드를 테스트 할 때,'Eater'라는 모조를 만들어서 그 메소드에 넘겨주고,'eat'이 호출되었는지 확인하십시오. –

관련 문제