Как издеваться над защищенным полем? - PullRequest
1 голос
/ 23 ноября 2010

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

Я уверен, что мой тест в порядке:

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

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

PS: я прочитал этот вопрос , но я, кажется, не могу понять, что это, ни голова, ни хвост!

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

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

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

1 голос
/ 23 ноября 2010

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

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

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