2017-03-07 52 views
0

你好我是新來的編碼,特別是單元測試,我試圖找到一種方法來設置兩個引用參數私有方法,以測試它,而不會改變我的任何我的代碼,例如:將ref參數設置爲私有方法

public class A 
{ 

    public string RefPrivateMethod() 
    { 
     //some code that usually set the strings 

     CompareTwoRefStrings(ref largerString, ref smallerString); 

     return largerString; 
    } 

    private void CompareTwoRefStrings(ref string largerString, ref string smallerString) 
    { 
     int res = largerString.CompareTo(smallerString); 
     string temp; 

     if (!(res >= 0)) 
     { 
      temp = largerString; 
      largerString = smallerString; 
      smallerString = temp; 
     } 
    } 
} 
+2

你的問題是什麼? –

+0

如何從我的測試中設置largeString和smallerString參數。 – CorryM

+0

該代碼甚至沒有編譯... – Fildor

回答

0

它知道如何通過測試設置參數,而不知道通常設置它們的代碼是什麼,這有點問題。 雖然您可以使用Typemock,但它們具有支持分配參考和輸出參數的功能。 使用時你的測試將是類似的東西:

[TestMethod] 
public void TestMethod1() 
{ 
    A classUnderTest = new A(); 
    string larger = "blablablabla", smaller = "b"; 

    Isolate.NonPublic.WhenCalled(classUnderTest,"CompareTwoRefStrings").AssignRefOut(smaller, larger).CallOriginal(); 

    var result = classUnderTest.RefPrivateMethod(); 

    Assert.AreEqual(larger, result); 
} 
0

對不起CorryM,

我認爲你需要公開暴露你的CompareTwoRefStrings方法可以使用單元測試來測試它。

你可以寫出接口方法,將爲你做到這一點,所以你不會損害原始(CompareTwoRefStrings)方法的訪問級別。

它只是語義,但單元測試應該只覆蓋方法的基本功能。所有其他功能應該被模擬,以便您的測試不會由於先決條件失敗而失敗。如果你試圖覆蓋RefPrivateMethod(如果這是一個真正的方法),那麼你不會寫單元測試 - 但某種形式的集成測試,因爲你不會只測試邏輯的實際方法,但方法以及任何RefPrivateMethod調用的其他代碼部分。

PS 還有一種使用反射測試私有方法的骯髒方法,但我不會建議這種方法。

1

單元測試是你的類的客戶。它通過公共接口鍛鍊你的班級,並驗證班級行爲是否符合預期。由行使我的意思是嘗試你的班級的各種使用場景。

私人方法呢?

  • 調用私有方法是對於您的類不是預期的使用場景。有些客戶端可以使用反彙編程序來查找私有成員的詳細信息,然後使用反射來調用它。但這不是課程應該如何使用。你多少次致電DateTime課程的私人成員?我敢打賭答案是零。因爲您正在使用具有記錄和預期行爲的公共接口。
  • 任何私有成員都是實現細節。它可以隨時重新命名,重構或刪除。沒有保證。使用私人會員對客戶來說是不安全的。測試私人會員對你來說是浪費時間。

你的班級只有一種方法在公共界面 - RefPrivateMethod(我希望真實姓名更有意義)。這就是客戶將要使用的。這就是你應該測試的。

相關問題