如何使用私有对象来访问或修改类中方法的变量

本文关键字:修改 方法 变量 访问 何使用 对象 | 更新日期: 2023-09-27 18:35:26

我是编写单元测试的新手。我使用 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
}
}
}

如何使用私有对象来访问或修改类中方法的变量

通常单元测试测试类的公共"外围应用"。

您应该以不需要修改私有变量进行测试的方式设计类。 这样,您可以更改实现更改,并且仍然重新运行测试并查看功能是否未损坏。

在依赖注入上查找资源。 在您的示例中,可以将构造函数中的连接字符串传递给 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
        }
    }
}