0

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

}
}
4

1 回答 1

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
        }

    }
}
于 2012-05-25T18:10:04.970 回答