2014-02-26 9 views
8

최근에 테스트에 관심이 많아졌고 지금 가능한 가장 좋은 방법으로 단위 테스트를 수행하는 방법을 배우려고합니다. Rhino Mock과 함께 NUnit을 사용합니다. 나는 또한 Stackoverflow에서 많이 읽었지만 내 질문에 대한 명확한 답을 찾을 수 없었다.스텁 대 모의 단위 테스트

아래와 같은 방법이 있다면 OfficeClass 종속성을 모의하고 GetAllOffices를 테스트하거나 종속성에 대한 스텁 만 사용하고 GetAllOffices 메서드가 호출되었는지 확인하고 실제로 스텁에 대한 설정에서 예상했던 사무실로 돌아 왔습니까? OfficeClass가 또 다른 POCO 경우

public Offices GetAllOffices() 
{ 
    try 
    { 
     var offices = officeClass.GetAllOffices(); 
     return offices; 
    } 
} 

은 어떤 차이를 만들거나이 할 경우 스터 빙 대 조롱의 sence의 웹 서비스는 말?

짧은 질문 : 모의 할시기와 단위 테스트에서 스텁시기?

+0

그 게시물을 일찍,하지만 난 여전히 이상 다른 하나를 사용하기 때문에 나는 그것이 contex에서 어떤 입력을 얻을 도움이 될 거라 확신하지 못했습니다 내 자신의 코드. –

+0

게시물에 무엇이 누락되어 있는지 모릅니다. 모든 것이 있습니다. 이 두 개념 사이의 모든 차이점을 나열합니다. – BartoszKP

+0

나는 "내가 모의 할 때와 단위 테스트에서 언제 스텁을 할 것인가?"라는 질문에 대한 대답을 가지고 있다고 생각합니다.) 나는이 두 가지의 차이를 깨달았지만 모방해야 할 때와 내가해야 할 때가 아니라고 생각합니다. 단위 테스트의 컨텍스트에서 객체를 스텁합니다. –

답변

11

Mocks는 의존성의 "모의 (mock)"를 생성하는 프레임 워크를 사용합니다. 예를 들어 officeClass가 데이터 저장소 인 경우 모의 프레임 워크 (MOQ를 사용)를 사용하여 저장소 모의 객체를 생성 할 수 있습니다. 그렇기 때문에 의존성에 대한 인터페이스를 사용하여 테스트에 이상적으로 만드는 이유는 조롱 프레임 워크가 테스트 용 인터페이스를 쉽게 만들 수 있기 때문입니다.

필자가 이해하는대로 스텁을 사용하면 종속성을 수동으로 줄이고 미리 준비된 응답을 만들 수 있습니다. 예를 들어 IOfficeClass 인터페이스가 있고 그 클래스에서 상속받은 새 클래스를 만들면 해당 클래스를 서비스에 삽입하여 사용할 수 있습니다.

다시 웹 서비스와 같은 것들은 IRepository 패턴과 같은 일부 인터페이스에 래핑되어야합니다. 그러면 웹 서비스를 공격 할 필요없이 논리를 쉽게 테스트 할 수 있습니다. POCO 클래스와 동일합니다.

public interface IOfficeRepository 
{ 
    IQueryable<Office> GetAll(); 
} 

을 그리고 서비스

public class MyOfficeService 
{ 
    private readonly IOfficeRepository officeRepostiory; 

    public MyOfficeService(IOfficeRepository repository) 
    { 
     this.officeRepostiory = repository; 
    } 

    public Office GetOffice(int id) 
    { 
     return this.officeRepostiory.GetAll().SingleOrDefault(o => o.Id == id); 
    } 
} 

이 방법을 당신은 또한 당신의 주요 응용 프로그램이나 사업을 수정하지 않고도 기본 데이터 소스를 변경할 수 있습니다

그래서 귀하의 경우 예를 들어, 당신은 할 것이다 로직 코드.

이 사용 MOQ처럼 보일 것입니다 귀하의 단위 테스트 :

[TestClass] 
public class OfficeUnitTest 
{ 
    private MyOfficeService service; 

    [TestInitialize] 
    public void Setup() 
    { 
     var officeRepository = new Mock<IOfficeRepository>(); 

     var office = new List<Office>(); 
     office.Add(new Office{ Id = 1 }); 

     officeRepository.Setup(m => m.GetAll()).Returns(office.AsQueryable()); 

     this.service = new MyOfficeService(officeRepository.Object); 
    } 

    [TestMethod] 
    public void TestGetById() 
    { 
     Assert.IsNotNull(service.GetOffice(1)); 

     // my mock will never return a value for 2 
     Assert.IsNull(service.GetOffice(2)); 
    } 
} 

당신은 망신 시켰 아래 스텁에 대한 자세한 내용을보실 수 있습니다 : 내가 읽어 봤는데

http://martinfowler.com/articles/mocksArentStubs.html

http://msdn.microsoft.com/en-us/library/ff649690.aspx

+0

_martinfowler_ 하나는 ** Dummy **, ** Fake **, ** Stubs ** 및 ** Mocks **에 대한 4 가지 의미에 대한 좋은 설명이라고 생각합니다. 고맙습니다. –