2010-11-22 11 views
1

クラスNodeIdGeneratorに保護されたフィールドを模擬しようとしています。コンストラクタでフィールドの値を設定したい場合は、NodeIdGeneratorに属するGetNext()メソッドを呼び出します。保護されたフィールドを模擬する方法は?

イムかなり確信して私のテストは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()を呼び出すと、それはスーパークラスではなく、私はそれを使用したい1つに属する_previousIdオブジェクト使用しています(モッククラスでは。)

だから、どのように私は、保護されたフィールドを模擬するのですか?

PS:私はthis questionを読みましたが、私はそれを頭にも尾にもできないようです。

答えて

1

あなたが投稿したコードがnewとして_previousIdを宣言し、それは、基本クラスフィールドを隠します - それを上書きしません。基本クラスはGetNextを呼び出すときにその値を使用せず、独自のフィールドを使用します。

宣言を削除して、基本クラスの保護されたフィールドにアクセスしてみてください。

+0

ハハ、そう簡単です。ありがとう。私は 'private new int 'という行を削除しましたか? _previousId; 'そしてちょっと前のこと! – Nobody

1

可能であれば、それはpreviousId仮想プロパティを作成し、模擬でゲッターを上書きする方が良いでしょう:

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

private class NodeIdGeneratorMock : NodeIdGenerator 
{ 
    protected override int? PreviousId 
    { 
     get { return _previousId; } 
    } 
} 
関連する問題