2016-11-18 11 views
4

私はこの件に関してGoogleが見つけることができるほとんどすべてのリンクを調べて、正しく動作しない以下の2つのソリューションを考え出しました。私は単に文字列を返す保護されたメソッドを持っています。保護されたメソッドをモック

protected virtual string ConfirmText 
    { 
     get 
     { 
      return "someTextHere"; 
     } 
    } 

これはビューモデルに含まれています。これまでのところ、私が試してみました私のテストがある -

[TestMethod] 
    public void Confirm_Text_test() 
    { 
     Mock<TestViewModel> testViewModel= new Mock<TestViewModel>(null, null, null); 

     testViewModel.Protected() 
      .Setup<string>("ConfirmText") 
      .Returns("Ok") 
      .Verifiable(); 


     testViewModel.Verify(); 
    } 

は、私はそれに作用しない、上記の例で、私は唯一のセットアップを持っていることを理解し、そして主張します。私はそれはそれは、その保護レベルにアクセスできない言うような

var result = testViewModel.ConfirmText; 

としてセットアップに作用する方法を見つけることができませんでした。

私が試してみました次の方法が

var result = testViewModel.Object.GetType() 
      .InvokeMember("ConfirmText", 
      BindingFlags.InvokeMethod | 
      BindingFlags.NonPublic | 
      BindingFlags.Instance, 
      null, 
      testViewModel.Object, 
      null); 

あるほとんどの例は、私が最初に試した方法と同様のショーの何かに見てきたように、私は何かを逃しています。

+4

これは、メソッドが、プロパティではありません。 – dymanoid

+0

私は信じられないほど馬鹿です。それはおそらく何も働いていない理由を説明するでしょう!私はそれを指摘してくれてありがとう、探しに戻ってきます。 –

+3

なぜ保護されたプロパティをモックしたいですか?通常、オブジェクトをモックして、メソッド/プロパティへの外部呼び出しを制御または検証します。誰がこれを呼び出していますか、モックで何をしようとしていますか? – KMoussa

答えて

2

上記のコメントに従って、これを編集ではなく回答として投稿してください。

私は上記から反射を使用して以下のアドバイスでこれを解決しました。

方法ビーイングと
[TestMethod] 
public void ConfirmText() 
{ 
    TestViewModel testViewModel= new TestViewModel (null, null, null); 

    var result = testViewModel.GetType() 
    .InvokeMember("ConfirmText", 
    BindingFlags.GetProperty | 
    BindingFlags.NonPublic | 
    BindingFlags.Instance, 
    null, 
    testViewModel, 
    null); 

    Assert.AreEqual("Confirm", result); 
} 

-

protected override string confirmText 
{ 
    get 
    { 
     return Properties.Resources.confirmMessage; 
    } 
} 
関連する問題