2010-11-22 7 views
1

NodeIdGenerator 클래스의 보호 된 필드를 모의합니다. 생성자에서 필드의 값을 설정하려면 GetNext() 메서드를 호출하고 NodeIdGenerator에 속합니다.보호 된 필드를 조롱하는 방법?

임 확신 내 테스트는 OK입니다 :

public class NodeIdGeneratorTests 
{ 

    [Fact(DisplayName = "Throws OverflowException when Int32.MaxValue " + 
     "IDs is exceeded")] 
    public void ThrowsOverflowExceptionWhenInt32MaxValueIdsIsExceeded() 
    { 
     var idGenerator = new NodeIdGeneratorMock(Int32.MaxValue); 
     Assert.Throws(typeof(OverflowException), 
      () => { idGenerator.GetNext(); }); 
    } 

    /// <summary> 
    /// Mocks NodeIdGenerator to allow different starting values of 
    /// PreviousId. 
    /// </summary> 
    private class NodeIdGeneratorMock : NodeIdGenerator 
    { 
     private new int? _previousId; 

     public NodeIdGeneratorMock(int previousIds) 
     { 
      _previousId = previousIds; 
     } 
    } 

} 

내 문제는 모의 수업입니다. 내가 내 테스트에 GetNext()를 호출 할 때, 그것은 슈퍼 클래스가 아닌 내가 사용하려는 하나에 속하는 _previousId 객체 사용 (모의 수업을.)

그래서, 어떻게 보호 필드를 조롱합니까?

추신 : 나는 this question을 읽었지만 머리도 꼬리도 만들 수 없습니다!

답변

1

당신이 게시 한 코드는 new_previousId 선언을, 그래서 기본 클래스 '필드를 숨 깁니다 - 그것을 무시하지 않습니다. 기본 클래스는 GetNext에 전화 할 때 해당 값을 사용하지 않고 자체 필드를 사용합니다.

선언을 제거하고 기본 클래스 'protected 필드에 액세스하십시오.

+0

하하, 너무 쉽습니다. 감사. 방금 private int를 삭제했습니다. _previousId; 그리고 헤이 프레스토! – Nobody

1

previousId 가상 재산을하고 모의에서 게터 대체 할 더 나은 것이 가능하다면 :

public class NodeIdGenerator 
{ 
    protected virtual int? PreviousId { ... } 
} 

private class NodeIdGeneratorMock : NodeIdGenerator 
{ 
    protected override int? PreviousId 
    { 
     get { return _previousId; } 
    } 
}