2010-11-22 3 views
1

Я пытаюсь высмеять защищенное поле в классе NodeIdGenerator. Я хочу установить значение поля в конструкторе, а затем вызвать метод GetNext(), который принадлежит NodeIdGenerator.Как насмехаться над защищенным полем?

Im уверен, что мой тест 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 объект, принадлежащий к суперкласса, а не тот, который я хочу, чтобы использовать (в макете классе.)

Итак, как я издеваться защищенного поля?

PS: Я прочитал this question, но я не могу показаться головой и хвостом!

ответ

1

код Вы разместили объявляющий _previousId, как new, так что скрывает поле базового класса - он не отменяет его. Базовый класс не будет использовать это значение при вызове GetNext, он будет использовать свое собственное поле.

Попробуйте удалить объявление и просто получить доступ к защищенному полю базового класса.

+0

Ха-ха, так просто. Благодарю. Я просто удалил строку `private new int? _previousId; `и hey presto! – Nobody 2010-11-22 21:28:47

1

Если возможно, было бы лучше сделать previousId виртуальной собственности и переопределить геттер в макет:

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

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