سؤال

أحاول أن أسخر من حقل محمي في الفصل 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 كائن ينتمي إلى الفئة الفائقة ، وليس الكائن الذي أريده استخدامه (في فئة وهمية.)

لذا ، كيف أسخر من الحقل المحمي؟

ملاحظة: لقد قرأت هذا السؤال لكن لا يمكنني أن أبدو رأسًا ولا ذيلًا!

هل كانت مفيدة؟

المحلول

يعلن الرمز الذي نشرته _previousId مثل new, ، لذلك يخفي حقل الفئة الأساسية - لا يتجاوزه. لن تستخدم الفئة الأساسية هذه القيمة عند الاتصال GetNext, ، سوف تستخدم مجالها الخاص.

حاول إزالة إعلانك والوصول إلى الحقل المحمي "الفئة".

نصائح أخرى

إذا كان ذلك ممكنًا ، فسيكون من الأفضل القيام به previousId خاصية افتراضية وتجاوز getter في وهمية:

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

private class NodeIdGeneratorMock : NodeIdGenerator
{
    protected override int? PreviousId
    {
        get { return _previousId; }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top