Как я могу использовать PrivateObject для доступа или изменения переменной метода в классе

Я новичок в написании модульных тестов. Я использовал PrivateObject для доступа и изменения частного члена класса, чтобы использовать его во время тестирования.

Однако, если я хочу получить доступ к частной переменной метода, который я тестирую, как я могу это сделать. Я не буду менять какие-либо функции, но мне нужно изменить переменную, чтобы завершить модульный тест.

Это то, что я пытаюсь сделать. В классе ABC я хочу изменить dwConn, поскольку у меня не будет доступа к SqlConnectionManager для модульных тестов, но я могу получить к нему доступ во время работы приложения. Большое спасибо, что прочитали это. Любая помощь reg это было бы хорошо.

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
}

}
}

person Sailoosha    schedule 25.05.2012    source источник
comment
Если это частные переменные, и вам нужно их изменить, у вас должны быть общедоступные геттеры/сеттеры для каждой переменной. Или вместо этого используйте свойства.   -  person ulu5    schedule 25.05.2012


Ответы (1)


Обычно модульные тесты проверяют общедоступную «поверхность» вашего класса.

Вы должны проектировать свои классы таким образом, чтобы вам не нужно было изменять частные переменные для тестирования. Таким образом, вы можете изменить изменения реализации, а также перезапустить свои тесты и убедиться, что функциональность не нарушена.

Ищите ресурсы по внедрению зависимостей. В вашем примере вы можете передать строку подключения в конструкторе 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
        }

    }
}
person foson    schedule 25.05.2012