2010-11-22 5 views
1

Ich versuche, ein geschütztes Feld in der Klasse NodeIdGenerator zu verhöhnen. Ich möchte den Wert des Feldes in einem Konstruktor festlegen und dann die Methode GetNext() aufrufen, die zu NodeIdGenerator gehört.Wie spottet man ein geschütztes Feld?

Im ziemlich sicher, dass mein Test ist 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; 
     } 
    } 

} 

Mein Problem in der Mock-Klasse ist. Als ich GetNext() in meinem Test nennen, verwendet es das _previousId Objekt die Oberklasse gehört, nicht derjenige, den ich es benutzen will (in der Mock-Klasse.)

Also, wie Sie verspotten ich das Schutzfeld?

PS: Ich habe gelesen this question, aber ich kann nicht scheinen, Kopf oder Schwanz davon zu machen!

Antwort

1

Der Code, den Sie geschrieben haben erklärt _previousId als new, so dass er sich versteckt die Basisklasse Feld - Es überschreibt es nicht. Die Basisklasse wird diesen Wert nicht verwenden, wenn Sie GetNext aufrufen, es wird ein eigenes Feld verwenden.

Versuchen Sie, Ihre Deklaration zu entfernen, und greifen Sie nur auf das geschützte Feld der Basisklasse zu.

+0

Haha, so einfach. Vielen Dank. Ich habe gerade die Zeile 'private new int 'entfernt. _previousId; 'und hey presto! – Nobody

1

Wenn möglich wäre es besser, previousId ein virtuelles Eigentum zu machen und die Getter in der Mock außer Kraft setzen:

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

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