2010-05-02 6 views
0

저는 조롱하는 것이 처음이며 Rhino Mock으로 시작했습니다. 내 시나리오는 이렇게 .. 내 클래스 라이브러리에 나는 공용 함수를 가지고 있고 그 안에는 서비스로부터 출력을 얻는 개인 함수 호출이있다. 개인 함수 종속성을 제거하려고한다.Rhino 모의를 사용하여 공용 함수 내에서 개인 함수의 종속성 제거

public class Employee 
    {   
     public virtual string GetFullName(string firstName, string lastName) 
     { 
      string middleName = GetMiddleName(); 
      return string.Format("{0} {2} {1}", firstName, lastName,middleName); 
     } 

     private virtual string GetMiddleName() 
     { 
      // Some call to Service 

      return "George"; 
     } 
    } 

이 있지만, 난 그냥 GetMiddleName() 함수의 종속성을 제거하는 방법을 알고 싶어 내 진짜 시나리오 아니고, 내가 단위 테스트 동안 일부 기본 값을 반환해야합니다.

참고 : 나는 같은 기능을 Interface..Keeping 포함 here..or 민간 기능을 변경할 수 없습니다, 이거 받아요

+0

해당 코드는 처음부터 컴파일되지 않습니다. 개인 메소드는 가상 일 수 없습니다. –

답변

2

문제를 조롱 할 수있는 방법이 부분이있다 : "서비스에서 출력을 얻는 개인 함수 호출". 그 서비스는 당신이 그것을 조롱 할 수 있도록 주입되어야합니다. Rhino가 서비스 자체의 구체적인 인스턴스를 생성하는 경우 Rhino가 도움을 줄 수 있다고 생각하지 않습니다.

TypeMock 당신을 도울 수 있습니다 - 나는 당신이 무엇이든을 조롱하게 만들 수 있다고 생각합니다.하지만 침략의 위험이 있습니다.

당신은 민간 메소드를 호출 의 종속성을 제거하지해야합니다, 당신은 개인 메서드 내에서 종속성 을 제거해야합니다. 그렇게 할 수 없다면, 코드는 단순히 TypeMock과 같은 것이 없다면 테스트 할 수 없습니다. private 방법은 virtual하지 않을 수

0

한 가지 가능한 솔루션은 추출을 사용하여 테스트중인 클래스의 검증 클래스를 파생하는 패턴을 무시하고 예에 private가 아닌 다른 무언가를 있어야 private 방법 (오버라이드 (override)하는 것입니다 - 아마도 메서드를 재정의 할 수 있도록하려면 protected?)을 의미합니다.

public class Employee 
{   
    public virtual string GetFullName(string firstName, string lastName) 
    { 
     string middleName = GetMiddleName(); 
     return string.Format("{0} {2} {1}", firstName, lastName,middleName); 
    } 

    protected virtual string GetMiddleName() 
    { 
     // Some call to Service 

     return "George"; 
    } 
} 

///<summary> 
///Testable Employee class 
///</summary> 
public class TestableEmployee : Employee 
{  
    public string MiddleName; 

    public virtual string GetFullName(string firstName, string lastName) 
    { 
     string middleName = GetMiddleName(); 
     return string.Format("{0} {2} {1}", firstName, lastName,middleName); 
    } 

    protected override string GetMiddleName() 
    { 
     // provide own implementation to return 
     // property that we can set in the test method 

     return MiddleName; 
    } 
} 

[TestMethod] 
public GetFullName_ReturnsSetName() 
{ 
    var testEmployee = new TestableEmployee(); 
    string firstName = "first"; 
    string middleName = "middle"; 
    string lastName = "last"; 

    TestableEmployee.MiddleName = middleName; 

    string fullName = GetFullName(firstName, lastName); 

    Assert.AreEqual(string.Format("{0} {2} {1}", 
        firstName, lastName, middleName), 
        fullName 
        ); 
} 

GetMiddleName()는 서비스 호출 주위 래퍼 인 경우 시험 방법은, 다음은 Employee 클래스의 속성으로 서비스 인터페이스를 가지고 더 쓸만한 디자인 될 수 있습니다. 이렇게하면 추출 및 재정의 패턴을 사용하거나 Unity 또는 Castle Windsor과 같은 IoC (Inversion of Control) 컨테이너를 사용하여 서비스 유형을 조롱 할 수 있습니다.

관련 문제