2013-11-21 2 views
1

나는 그 중 하나의 모델에서 작동 비즈니스 로직 프로세스의 일련의 수행 클래스있다 : 가정비웃음 방법

public virtual void TryToRunProcess(Model model) 
{ 
    var result = RunCheckMethodOne(model) && RunCheckMethodTwo(model); 
    if (result) 
     RunMethodThree(model); 
} 

internal virtual bool RunCheckMethodOne(Model model) 
{ 
    ... 
} 

internal virtual bool RunCheckMethodTwo(Model model) 
{ 
    ... 
} 

internal virtual void RunMethodThree(Model model) 
{ 
    ... 
} 

를 그 모델과 관련 RunCheckMethodOne()와 RunCheckMethodTwo() 메서드는 자체 단위 테스트 집합을 보증하기에 충분히 복잡하므로 RunCheckMethodOne() 및 RunCheckMethodTwo()에서 적절한 응답을 받으면 RunMethodThree()가 올바르게 실행되는지 테스트하고 싶습니다.

비즈니스 로직 클래스를 조롱하고 특정 결과를 반환하는 두 가지 확인 방법을 설정 한 다음 세 번째 방법이 실행되는지 확인하여이 작업을 수행하고 싶습니다. 내 단위 테스트의

하나는 :

[TestMethod] 
public void TryToRunProcessBothCheckMethodsAreTrueShouldExecuteMethodThreeTest() 
{ 
    var model = new Model(); 

    var mock = new Mock<ModelBusinessLogic>(); 
    mock.Setup(r => r.RunCheckMethodOne(It.IsAny<Model>())).Returns(true); 
    mock.Setup(r => r.RunCheckMethodTwo(It.IsAny<Model>())).Returns(true); 
    mock.Setup(r => r.RunMethodThree(It.IsAny<Model>())).Verifiable(); 

    mock.Object.TryToRunProcess(model); 

    mock.Verify(r => r.RunMethodThree(It.IsAny<Model>()), Times.Once()); 
} 

지금, 그것은 작동해야처럼이 나는이 단위 테스트 RunCheckMethodOne()와 RunCheckMethodTwo() 메서드는 다음과 같이 조롱되지 않는 실행 그러나 때 보이는 날에 나는 기대할 것이다. 모의 객체에 설정된 값을 반환하기보다는 실제로 ModelBusinessLogic 클래스 내에서 실행됩니다.

비즈니스 로직 내에서 메소드를 조롱 할 수 있도록 동일한 비즈니스 로직 메소드를 동일한 클래스에 유지할 수 있도록 구현시 무엇을해야합니까? 다른 방법으로 특정 시나리오를 연습하는 수업?

.Net Framework 4.5 및 Moq 4.0.0.0을 사용하고 있습니다.

+1

mock.Callbase = true가 도움이 되나요? –

+0

나는 그 깃발을 또한 사용하는 것을 시도하고 저것은 돕는 것을 보이지 않는다. Moq에 대한 Intellisense 도움말에 따르면 CallBase 속성은 설치 프로그램이 없을 때 기본 가상 구현으로 기본 설정됩니다. ModelBusinessLogic의 기본 구현보다는 명시 적으로 사용하려는 설정이 이미 있으므로 도움이 될 것 같습니다. –

답변

1

당신은 두 가지를 수행해야합니다

  • mock.CallBase = 진실을;
  • 대신 내부 메소드를 public 또는 protected로 설정하십시오 (분명히 이상적이지 않음).

개인 테스트를 보증하기에 충분한 복잡성이있는 경우 수업을 해지해야한다고 생각합니다. 그것은 내게 너무 많은 엔지니어링이 될 것 같지 않습니다. 이 강력한 이름이 아닌 경우

편집

당신은 양자 택일 클래스에

를 추가 할 수 있습니다. 자세한 내용은 this question을 참조하십시오.

+1

또는 내부를 보호하십시오. – dcastro

+0

Thx도 덧붙였다. –

+1

고마워요 제임스! RunCheckMethodOne(), RunCheckMethodTwo() 및 RunMethodThree()의 메서드 시그니처에 보호 된 내부 키워드를 추가하는 것이 트릭을 수행하는 것으로 보입니다. mock.CallBase = true로 설정할 필요가 없었습니다. 내 다음 질문 (순수한 학문적 평화에 대한)은 보호 된 내부 방법이이 경우 내부 방법과 다르게 작동하는 이유입니다. –