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
그 게시물을 일찍,하지만 난 여전히 이상 다른 하나를 사용하기 때문에 나는 그것이 contex에서 어떤 입력을 얻을 도움이 될 거라 확신하지 못했습니다 내 자신의 코드. –
게시물에 무엇이 누락되어 있는지 모릅니다. 모든 것이 있습니다. 이 두 개념 사이의 모든 차이점을 나열합니다. – BartoszKP
나는 "내가 모의 할 때와 단위 테스트에서 언제 스텁을 할 것인가?"라는 질문에 대한 대답을 가지고 있다고 생각합니다.) 나는이 두 가지의 차이를 깨달았지만 모방해야 할 때와 내가해야 할 때가 아니라고 생각합니다. 단위 테스트의 컨텍스트에서 객체를 스텁합니다. –