0

我是編寫單元測試的新手。 我已經使用PrivateObject來訪問和修改一個類的私有成員,以便在測試時使用它。如何使用PrivateObject來訪問或修改類中某個方法的變量

但是,如果我想訪問我正在測試的方法的私有變量,我該怎麼做。我不會改變任何功能,但我需要修改一個變量才能完成單元測試。

這就是我想要做的。 在ABC課上,我想修改dwConn,因爲我無法訪問SqlConnectionManager進行單元測試,但是我可以在應用程序運行時訪問它。非常感謝您閱讀本文。任何幫助章這將是很好的。

public class ABCTest 
{ 
public void MethodATest() 
{ 
const string connectionString = @"Data Source=servername\MSSQLSERVER2008;Initial Catalog=DB1;User ID=user1;Password=pswd1"; 

SqlConnection sqlConn = new SqlConnection(connectionString); 

PrivateObject param0 = new PrivateObject(target); 
param0.SetField("dwConn", sqlConn); 

actual = target.MethodA(); 
} 
} 

public Class ABC() 
{ 
Method A() 
{ 
SqlConnection dwConn = (SqlConnection)SqlConnectionManager.Instance.GetDefaultConnection(); 

using(dwconn) 
{ 
//some stuff 
} 

} 
} 
+0

如果它們是私有變量並且您需要更改它們,則應該爲每個變量設置公共的getter/setter。或者改用屬性。 – ulu5

回答

0

通常單元測試會測試您班級的公共「表面積」。

你應該設計你的類,你不需要修改私有變量進行測試。這樣,您可以更改實施更改,並且仍然重新運行測試並查看功能未損壞。

尋找有關依賴注入的資源。在您的示例中,您可以將構造函數中的連接字符串傳遞給ABC,或者傳入ABC調用的接口以獲取連接字符串。然後,您可以在項目中擁有一個實現該接口的具體類,並調用SqlConnectionManager.Instance.GetDefaultConnection();,而測試項目中的另一個實例只是將其設置爲硬編碼字符串。

更好的是,甚至不要在單元測試中連接到數據庫 - 這也應該被刪除。

public class ABCTest 
{ 
    public class TestConnectionManager : IConnectionManager 
    { 
     public string GetConnection() 
     { 
      return @"Data Source=servername\MSSQLSERVER2008;Initial Catalog=DB1;User ID=user1;Password=pswd1"; 
     } 
    } 
    public void MethodATest() 
    { 
     var abc = new ABC(new TestConnectionManager()); 

    } 
} 

public interface IConnectionManager 
{ 
    string GetConnection(); 
} 

public class ConnectionManager : IConnectionManager 
{ 
    public string GetConnection() 
    { 
     return SqlConnectionManager.Instance.GetDefaultConnection(); 
    } 
} 


public class ABC 
{ 

    IConnectionManager connectionManager; 

    public ABC(IConnectionManager cm) 
    { 
     connectionManager = cm; 
    } 


    public void A() 
    { 
     //create connection from connectionManager.GetConnection() 

     using(dwconn) 
     { 
     //some stuff 
     } 

    } 
} 
相關問題