2016-11-18 170 views
4

我已經瀏覽了幾乎所有可能在Google上找到的關於此主題的鏈接,並且提出了以下兩種不能正確運行的解決方案。我有一個簡單的返回一個字符串的保護方法。模擬受保護的方法

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; 
    } 
}