2017-05-04 40 views
-2

你好計算器,起訂量:如何投放接口的模擬回接口

我嘗試寫上預期接口(EnvDTE.Project)的私有方法的單元測試。即時通訊使用起訂量框架來創建此接口的模擬:

Mock<Project> mock = new Mock<Project>(); 

後IM設置一些Propertys,我想施放此模擬的接口後面。 我想這一點:

mock.As<Project>();     //to implement the Project interface 
Project project = mock as Project; //this set Project to null 
Project project = (Project)mock; //this throws InvalidCastException 

有另一種方式來解決這個問題?感謝您的幫助:)

+0

您不會創建類自己的模擬,而是創建它們依賴的服務。然後通常通過構造函數注入來注入這些依賴項。 – Wheels73

+0

你的問題不清楚。你爲什麼要將模擬對象轉換回界面?沒有轉換,它是否按預期工作?你能解釋一下你需要做這種轉換的具體用途嗎?另外接口沒有私有方法。如果實現該接口的類具有私有方法,那麼它應該通過該特定類的單元測試進行測試,而不是通過接口進行測試。 –

+0

我嘗試測試一個私有方法。 – Desiigner

回答

1

您可以通過訪問您的嘲笑對象:

var mock = new Mock<Project>(); 
Project project = mock.Object; 
+0

這麼簡單,它的工作原理:非常感謝你:) – Desiigner

+0

@Designer - 這是如何讓你測試一個私有方法? – Wheels73

+0

@ Wheels73帶有類的PrivateObject,然後調用Method並使用對象Array來定義Parameter。 – Desiigner

0

如前所述,你並不需要模擬出你在做什麼。

假設我們有一個名爲「Project」的類。

public class Project 
    { 
     //Private method to test 
     private bool VerifyAmount(double amount) 
     { 
      return (amount <= 1000); 
     } 
    } 

然後我們可以使用您想要做的PrivateObject方法編寫測試。

[TestMethod] 
public void VerifyAmountTest() 
{ 
    //Using PrivateObject class 
    PrivateObject privateHelperObject = new PrivateObject(typeof(Project)); 
    double amount = 500F; 
    bool expected = true; 
    bool actual; 
    actual = (bool)privateHelperObject.Invoke("VerifyAmount", amount); 

    Assert.AreEqual(expected, actual); 
} 

這將實現你想要的。

+0

是的,它適用於正常的單元測試,但不適用於這個。 – Desiigner