2011-02-03 14 views
3

を見つけることができません。それでなぜスタブを作成したのですか?私はクラスAStubをインスタンス化するクラスAのメソッドとプロパティにアクセスするためにPrivateObjectクラスを使用PrivateObjectは、私はbasiclyこのようになります構造を持つプロパティ

public class AStub : A 
{ 
    protected override void DoSomethingSpecific() 
    { 
     // nothing to do 
    } 
} 

。これはしばらくの間働きました。何らかの理由で、プロパティまたはメソッドのいずれかにアクセスしようとするたびにクラッシュしました。テストのための

次のコードは:

var sut = new CommonIodAdapterImpl(); 
var accessor = new PrivateObject(sut); 

accessor.SetProperty("Identificator", "blablub"); 
accessor.Invoke("DoSomething", null); 

// assert... 

スローされる例外propertieや方法が見つからなかったことを私に言っMissingMethodExceptionです。しかし、私がデバッグし、hierachyをチェックすると、すべて正しいと思われるスペルがあるようです。

ありがとうございました。

+1

我々は 'AStub'がA''から継承されていないという事実が問題のコードサンプルのタイプミスであり、それは本当に 'パブリッククラスAStubでなければならないことと仮定しなければならない。A'? –

+0

申し訳ありませんが、私は何かを逃した右です... –

+0

実際にあなたのコードで "A"を継承しなかったか、これを他の方法で修正したという問題でしたか? – BenCr

答えて

9

を自分のアクセサを作成しました。

var accessor = new PrivateObject(sut, new PrivateType(typeof(A))); 
1

"public class AStub:A"にする必要はありませんか?

欠落しているメソッドの例外を解決するには、すべてをもう一度コンパイルしてください(!)。どちらが間違っているのか、エラーが消えていくか、コンパイラのエラーが表示されます。

それでも動作しない場合は、アセンブリの複数のコピー(GAC!を含む)がないかどうかを確認し、正しいパスからアセンブリをロードする場合はDeboug-Out-Windowを見てください。

1

私はちょうど同様のものを試しました、私はプロパティがプライベートではなく、保護されているからです。

私はあなたがそのレベルでのプライベートメンバーにアクセスするには、ベースクラスにPrivateType引数を設定する必要があります私のテストアセンブリに

public class AAccessor : A 
{ 
    // use this instead of Identificator 
    public string IdentificatorAccessor 
    { 
     get { return this.Identificator; } 
     set { this.Identificator = value; } 
    } 

    // test this method in your unit test 
    public void DoSomethingAccessor() 
    { 
     this.DoSomethingSpecific() 
    } 

    // need this to satisfy the abstract class 
    protected override void DoSomethingSpecific() 
    { 
     // do nothing here 
    } 
}